Ответ 1
Либо я не понимаю ваш вопрос, либо Enumerable # find - это то, что вы искали.
Я что-то пропустил в документации 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
Либо я не понимаю ваш вопрос, либо Enumerable # find - это то, что вы искали.
использовать массив 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]
Угадайте, что вы просто пропустили метод find в документах:
my_array.find {|e| e.satisfies_condition? }
Вам нужен сам объект или вам просто нужно знать, есть ли объект, который удовлетворяет. Если первое, то да: используйте find:
found_object = my_array.find { |e| e.satisfies_condition? }
в противном случае вы можете использовать any?
found_it = my_array.any? { |e| e.satisfies_condition? }
Последний залог с "истинным", когда найдет тот, который удовлетворяет условию. Первые будут делать то же самое, но возвращают объект.