Более эффективный Ruby способ сопоставить атрибут в массиве объектов с другим массивом? - PullRequest
18 голосов
/ 07 марта 2011

Я не буду повторять здесь свой вопрос, но есть ли более эффективный способ написать это?

  def recruits_names
    names = []
    for r in self.referrals do
      names << r.display_name
    end

    return names
  end

1 Ответ

52 голосов
/ 07 марта 2011

Используйте метод map:

Возвращает новый массив с результатами выполнения блока один раз для каждого элемента в enum.

def recruits_names
  self.referrals.map { |r| r.display_name }
end

[Обновить] Как отметил Стален в комментариях, этот пример может быть сокращен еще больше до:

def recruits_names
  self.referrals.map(&:display_name)
end

Для любопытных это потому, что & вызывает to_proc для объекта, следующего за ним (при использовании в вызове метода), и Symbol реализует to_proc для возврата Proc, который выполняет метод, обозначенный символом для каждого значения, переданного блоку (см. документация ).

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