Массив Ruby find_first объект?

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

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

Но я не удовлетворен по двум причинам:

  1. Это select сделанный мной пересечь целый массив, даже при том, что мы, возможно, взяли на поруки после первого хита.
  2. Мне была нужна строка кода (с условием) для выравнивания кандидатов.

Обе операции расточительны с предвидением, что существует 0 или 1 удовлетворяющий объект.

То, что я хотел бы, является чем-то как:

array.find_first(block)

который возвращает ноль или первый объект, для которого блок оценивает к истинному, заканчивая обход в том объекте.

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

125
задан the Tin Man 23 October 2019 в 00:46
поделиться

3 ответа

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

186
ответ дан 24 November 2019 в 00:57
поделиться

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

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

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

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

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

11
ответ дан 24 November 2019 в 00:57
поделиться

Думаю, вы только что пропустили метод поиска в документации:

my_array.find {|e| e.satisfies_condition? }
17
ответ дан 24 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: