我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"
答案 0 :(得分:5)
以下是您可以这样做的方法:
class Enumerator
def explicitly
each { |e| yield(*e) }
end
end
我对此执行了测试,并返回了正确的结果。
更新:更改为不明确捕获块。