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

Чистый способ вернуть массив из X.times в Ruby

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

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

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

4b9b3361

Ответ 1

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

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

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

http://www.ruby-doc.org/core/Enumerable.html#method-i-collect

Ответ 2

Вы можете использовать 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

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

Ответ 3

Я думаю, что-то вроде этого лучше

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