Какой самый быстрый способ в Ruby получить первый перечисляемый элемент, для которого блок возвращает true? - PullRequest
37 голосов
/ 19 марта 2012

Какой самый быстрый способ в Ruby получить первый перечисляемый элемент, для которого блок возвращает true?

Например:

arr = [12, 88, 107, 500]
arr.select {|num| num > 100 }.first  # => 107

Я хотел бы сделать это, не прогоняявесь массив, как и select, так как мне нужно только первое совпадение.

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

Ответы [ 4 ]

68 голосов
/ 19 марта 2012

Несколько основных классов ruby, включая Array и Hash, включают в себя модуль Enumerable, который предоставляет множество полезных методов для работы с этими перечислениями.

Этот модуль предоставляет find или detect методы , которые делают именно то, что вы хотите достичь:

arr = [12, 88, 107, 500]
arr.find { |num| num > 100 } # => 107

Оба имени метода являются синонимами друг к другу и делают в точности то же самое.

5 голосов
/ 19 марта 2012
arr[arr.index {|num| num > 100 }] #=> 107
2 голосов
/ 19 марта 2012
arr.find{|el| el>100} #107 (or detect; it's in the Enumerable module.)
0 голосов
/ 29 июня 2019

Я помню это, вспоминая ActiveRecord.find, который дает вам первую запись, и ActiveRecord.select, который вы используете, когда получаете все из них.

Не идеальное сравнение, но может быть достаточно, чтобы помочь запомнить.

...