Чистый способ вернуть массив из X.times в Ruby
Я часто хочу выполнить действие по массиву X раз, а затем вернуть результат, отличный от этого числа. Код, который я обычно пишу, следующий:
def other_participants
output =[]
NUMBER_COMPARED.times do
output << Participant.new(all_friends.shuffle.pop, self)
end
output
end
Есть ли более чистый способ сделать это?
Ответы
Ответ 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