Ruby Array объект find_first? - PullRequest
123 голосов
/ 04 марта 2010

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

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

Ответы [ 4 ]

176 голосов
/ 04 марта 2010

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

81 голосов
/ 17 апреля 2012

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

[1,2,3,11,34].detect(&:even?) #=> 2

OR

[1,2,3,11,34].detect{|i| i.even?} #=> 2

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

[1,2,3,11,34].select(&:even?)  #=> [2, 34]
15 голосов
/ 04 марта 2010

Полагаю, вы просто пропустили метод поиска в документах:

my_array.find {|e| e.satisfies_condition? }
11 голосов
/ 04 марта 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...