16

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?

2
  • 1
    I swear this isn't for reputation, but I really think you accepted the wrong answer. Collect is really EXACTLY the right one to use. Even if you make another answer an accept that one, I really think you should accept a map/collect answer for when someone else comes by and looks at this question. Commented Oct 5, 2011 at 17:24
  • I thought the same thing myself after experimenting so I switched Commented Oct 5, 2011 at 19:30

3 Answers 3

32

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

Sign up to request clarification or add additional context in comments.

Comments

7

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.

2 Comments

Imperative programmer! Rot in silicon hell!
@Andrew: Get off my lawn kid!
2

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.