Чистый способ вернуть массив из X.times в Ruby - PullRequest
14 голосов
/ 05 октября 2011

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

  def other_participants
    output =[]
    NUMBER_COMPARED.times do
      output << Participant.new(all_friends.shuffle.pop, self)
    end
    output
  end

Есть ли более чистый способ сделать это?

Ответы [ 3 ]

23 голосов
/ 05 октября 2011

звучит так, как будто вы можете использовать карту / сбор (это синонимы на Enumerable).он возвращает массив, содержимое которого является возвращением каждой итерации по карте / collect.

def other_participants
  NUMBER_COMPARED.times.collect do
    Participant.new(all_friends.shuffle.pop, self)
  end
end

Вам не нужна другая переменная или явный оператор возврата.

http://www.ruby -doc.org / ядро ​​/ Enumerable.html # метод-я-собирать

6 голосов
/ 05 октября 2011

Вы можете использовать each_with_object:

def other_participants
  NUMBER_COMPARED.times.each_with_object([]) do |i, output|
    output << Participant.new(all_friends.shuffle.pop, self)
  end
end

Из подробного руководства :

each_with_object (obj) {| (*args), memo_obj |...} → obj
each_with_object (obj) → an_enumerator

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

1 голос
/ 19 сентября 2016

Мне кажется, что-то вроде этого лучше

def other_participants
  Array.new(NUMBER_COMPARED) { Participant.new(all_friends.shuffle.pop, self) }
end
...