Ruby Array find_first объект?

Я что-то пропустил в документации Array? У меня есть массив, который содержит до одного объекта, удовлетворяющего определенному критерию. Я бы хотел эффективно найти этот объект. Лучшая идея, которую я имею в документах, такова:

candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?

Но я неудовлетворен по двум причинам: (1) этот выбор заставил меня пройти весь массив, хотя мы могли бы заручиться после первого попадания, и (2) мне понадобилась строка кода (с условием) до сгладить кандидатов. Обе операции расточительны с предузнанием, что 0 или 1 удовлетворяют объектам.

Мне хотелось бы что-то типа:

array.find_first(block) → отвечает nil или первый объект, для которого блок оценивает значение true, заканчивая обход этого объекта.

Должен ли я написать это сам? Все эти замечательные методы в Array заставляют меня думать об этом, и я просто не вижу его.

Спасибо заранее, Dan

Ответ 1

Либо я не понимаю ваш вопрос, либо Enumerable # find - это то, что вы искали.

Ответ 2

использовать массив detect, если вы хотите вернуть первое значение, где block возвращает true

[1,2,3,11,34].detect(&:even?) #=> 2

OR

[1,2,3,11,34].detect{|i| i.even?} #=> 2

Если вы хотите вернуть все значения, где block возвращает true, используйте select

[1,2,3,11,34].select(&:even?)  #=> [2, 34]

Ответ 3

Угадайте, что вы просто пропустили метод find в документах:

my_array.find {|e| e.satisfies_condition? }

Ответ 4

Вам нужен сам объект или вам просто нужно знать, есть ли объект, который удовлетворяет. Если первое, то да: используйте find:

found_object = my_array.find { |e| e.satisfies_condition? }

в противном случае вы можете использовать any?

found_it = my_array.any?  { |e| e.satisfies_condition? }

Последний залог с "истинным", когда найдет тот, который удовлетворяет условию. Первые будут делать то же самое, но возвращают объект.