Есть ли идиоматический способ ruby ​​/ rails для возврата первого истинного сопоставленного значения? - PullRequest
9 голосов
/ 03 августа 2011

У меня есть массив объектов, некоторые из которых отвечают: description, и я хочу получить описание от первого с достоверным описанием. Я мог бы сделать это:

objects.detect{|o| o.try(:description)}.description

или это:

objects.map{|o| o.try(:description)}.detect{|o| o}

, но первый не СУХОЙ (описание приведено там дважды), а второй перебирает весь массив перед тем, как найти значение. Есть ли что-нибудь в стандартной библиотеке ruby ​​или в расширениях Rails, что позволило бы мне сделать что-то вроде этого:

objects.detect_and_return{|o| o.try(:description)}

Я знаю, что мог бы написать это достаточно легко, но стандартные библиотеки достаточно велики, что мне может и не понадобиться. Есть ли функция, которая работает как мой detect_and_return?

1 Ответ

6 голосов
/ 03 августа 2011

Я не видел такого метода, и самым близким, что я нашел, был метод capture_first, который я нашел в геме merb-cache.Кажется, они наткнулись на ту же проблему и реализовали это:

module Enumerable
  def capture_first
    each do |o|
      return yield(o) || next
    end
    nil
  end
end

Вы также можете взглянуть на методы Array и Enumerable в Ruby библиотеку facets и посмотрите, не найдете ли вы что-нибудь подобное.В Facets довольно много вкусностей, так что вам может повезти.

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