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

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

Например:

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

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

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


person Nathan Long    schedule 19.03.2012    source источник


Ответы (2)


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

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

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

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

person Holger Just    schedule 19.03.2012
comment
Ах! find был метод, который я пытался вспомнить. Глупый я, я смотрел документы для Array, а не Enumerable. - person Nathan Long; 19.03.2012
comment
также известный в мире Ruby как detect - person tokland; 19.03.2012
comment
Всем привет синонимы. Я лично предпочитаю find (тем более, когда я не в среде Rails). Но вы правы, может быть лучше вообще использовать detect, чтобы не путать людей. - person Holger Just; 19.03.2012
comment
Обновление - теперь я всегда использую для этого псевдоним detect. Мне легко запомнить select reject detect, и я не путаюсь с find ActiveRecord. - person Nathan Long; 11.07.2013

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

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

person calasyr    schedule 29.06.2019