鉴于,
def wrapper &block
(1..5).inject yield
end
proc = Proc.new {|sum, n| sum + n }
为什么我不能打这个电话?
wrapper &proc
=> NoMethodError: undefined method `+' for nil:NilClass
当查看内部时,我看到inject无法分配备忘录或obj,因为将proc重写为proc = Proc.new {|memo, obj| puts memo ; puts obj }
会返回10次迭代。我还注意到(1..5).inject
只接受一个参数,它作为初始备忘录传递的内容,从技术上讲,它不是块作为真正的参数。
答案 0 :(得分:8)
这样做的方法是
def wrapper &block
( 1..5 ).reduce &block
end
p = proc { |a, b| a + b }
wrapper &p
#=> 15
但是在你的问题中,你有趣地试图使用yield
。当您使用yield
时,您不需要明确提及&block
参数 - 方法无法拒绝一个块,该块始终可以由方法内的yield
调用。但是,yield
需要参数。使用yield
实现目标的方法是:
def wrapper_2
( 1..5 ).reduce { |accumulator, input| yield accumulator, input }
end
这个表述仍然有点尴尬。事实证明,即使你没有指定&block
参数,也有一种在方法中获取块的秘密方法,那就是在方法中使用简单的Proc.new
:
def wrapper_3
( 1..5 ).reduce &Proc.new
end
答案 1 :(得分:0)
感谢您指出相关问题!我的谷歌搜索和网站搜索机制之前没有指出我。它帮助我看到我之前发出了一个愚蠢的语法错误(我尝试了(1..5).inject([]) proc
的调用),这让我误解了我所看到的内容。所以我需要的是事实上:
def wrapper proc
(1..5).inject 0, proc
end