Clean way to return an array from X.times in Ruby

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

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_enumerator

Iterates 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.


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