16

我经常想对数组执行 X 次操作,然后返回该数字以外的结果。我通常写的代码如下:

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

有没有更清洁的方法来做到这一点?

4

3 回答 3

31

听起来你可以使用 map/collect (它们是 Enumerable 的同义词)。它返回一个数组,其内容是通过映射/收集的每次迭代的返回。

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

您不需要另一个变量或显式返回语句。

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

于 2011-10-05T05:48:42.710 回答
6

你可以使用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

使用给定的任意对象迭代每个元素的给定块,并返回最初给定的对象。
如果没有给出块,则返回一个枚举器。

于 2011-10-05T03:39:29.450 回答
2

我认为这样的事情是最好的

def other_participants
  shuffled_friends = all_friends.shuffle
  Array.new(NUMBER_COMPARED) { Participant.new(shuffled_friends.pop, self) }
end
于 2016-09-19T08:59:15.740 回答