向Symbol#to_proc明确产生n个值

时间:2012-01-25 05:46:08

标签: ruby

discovered tonight Ruby的Symbol#to_proc处理除第一个之外的其他产生的值作为方法调用的参数。换句话说,这两个方法调用是等价的:

yields_three{ |a,b,c| a.foo(b,c) }
yields_three( &:foo )

我认为这可能是一个强大的(或至少是有趣的)成语,所以我尝试了以下内容:

class Player
  def add_score( points )
    @score += points
  end
end

my_array_of_players.zip( my_array_of_turn_scores ).each(&:add_score)

不幸的是,这不起作用:

NoMethodError: undefined method `add_score' for [<#Player 'Phrogz'>, 42]:Array

所以,问题是:你能写一个Enumerator#explicitly方法而不是产生一个值数组而不是明确地产生所有这些方法吗?

如果你成功了,这些应该有效:

pairs = [[1,2],[3,4],[5,6]]
pairs.map.explicitly(&:+) #=> [3,7,11]
pairs.map.explicitly(&:*) #=> [2,12,30]

class String
  def say_hey(b)
    puts "#{self} says 'hey' to #{b}"
  end
end
('a'..'d').each_cons(2).explicitly(&:say_hey)
#=> "a says 'hey' to b"
#=> "b says 'hey' to c"
#=> "c says 'hey' to d"

1 个答案:

答案 0 :(得分:5)

以下是您可以这样做的方法:

class Enumerator
  def explicitly
    each { |e| yield(*e) }
  end
end

我对此执行了测试,并返回了正确的结果。

更新:更改为不明确捕获块。