所以我想尝试做这样的事情:
def func(x,y)
if x.length == 1 then
n = x.pop()
yield(n,y)
else
n = x.pop()
yield(n,func(x,y))
end
end
称之为:
a = func([1,2,3,4,5],0) do |x,y|
x+y
end
有可能做这样的事吗?我一直没有得到块(yield)(LocalJumpError)。
我甚至试过做一些不同的事情:
def func(x,y)
func(x,y) do |tail|
..
end
end
但没有运气
感谢。
答案 0 :(得分:13)
是的,您可以明确地将该块作为参数:
def func(x, y, &block)
您仍然可以使用yield关键字向它屈服,但您也可以在递归时传递它:
yield(n, func(x, y, &block))
两种情况下的&
意味着block
参数不是普通参数,而是表示可以附加到任何Ruby方法调用的块。
答案 1 :(得分:2)
你错过了在递归调用中传递阻止 递归调用应如下所示: -
yield(n,func(x,y)) { |x,y| x+y})
由于你错过了在递归调用中传递块,当代码命中时: -
if x.length == 1 then
n = x.pop()
yield(n,y) <<<< Here
方法func在递归调用中没有作为参数传递的块,但ruby尝试调用不存在的块,从而导致错误。