Clean way to return an array from X.times in Ruby
I often want to perform an action on an array X times then return a result other than that number. The code I usually write is the following:
def other_participants
output =[]
NUMBER_COMPARED.times do
output << Participant.new(all_friends.shuffle.pop, self)
end
output
end
Is there a cleaner way to do this?
sounds like you could use map/collect (they are synonyms on Enumerable). it returns an array with the contents being the return of each iteration through the map/collect.
def other_participants
NUMBER_COMPARED.times.collect do
Participant.new(all_friends.shuffle.pop, self)
end
end
You don't need another variable or an explicit return statement.
http://www.ruby-doc.org/core/Enumerable.html#method-i-collect
You could use 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
From the fine manual:
each_with_object(obj) {|(*args), memo_obj| ... } → obj
each_with_object(obj) → an_enumeratorIterates the given block for each element with an arbitrary object given, and returns the initially given object.
If no block is given, returns an enumerator.
I thing something like this is best
def other_participants
shuffled_friends = all_friends.shuffle
Array.new(NUMBER_COMPARED) { Participant.new(shuffled_friends.pop, self) }
end
精彩评论