Подтвердить что ты не робот

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

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

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

    return names
  end
4b9b3361

Ответ 1

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

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

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, который выполняет указанный метод по символу на каждое значение, полученное для блока (см. документация).