Я пропускаю что-то в документации Массива? У меня есть массив, который содержит до одного объекта, удовлетворяющего определенный критерий. Я хотел бы эффективно найти тот объект. Лучшая идея, которую я имею из документов, является этим:
candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?
Но я не удовлетворен по двум причинам:
select
сделанный мной пересечь целый массив, даже при том, что мы, возможно, взяли на поруки после первого хита.Обе операции расточительны с предвидением, что существует 0 или 1 удовлетворяющий объект.
То, что я хотел бы, является чем-то как:
array.find_first(block)
который возвращает ноль или первый объект, для которого блок оценивает к истинному, заканчивая обход в том объекте.
Я должен записать это сам? Все те другие замечательные методы в Массиве заставляют меня думать, что это там, и я просто не вижу его.
Либо я не понимаю ваш вопрос, либо Enumerable # find - это то, что вы искали.
Вам нужен сам объект или вам просто нужно знать, есть ли объект, который удовлетворяет. Если первое, то да : use find:
found_object = my_array.find { |e| e.satisfies_condition? }
иначе вы можете использовать any?
found_it = my_array.any? { |e| e.satisfies_condition? }
Последний выйдет с «истиной», когда найдет тот, который удовлетворяет условию. Первый сделает то же самое, но вернет объект.
Думаю, вы только что пропустили метод поиска в документации:
my_array.find {|e| e.satisfies_condition? }