产量递归

发布于 2024-10-03 22:48:49 字数 475 浏览 1 评论 0原文

所以我想做这样的事情:

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

但没有运气,

谢谢。

So i am trying to do something like this:

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

calling it like:

a = func([1,2,3,4,5],0) do |x,y|
    x+y
end

Is it possible to do something like this? I keep getting no block given (yield) (LocalJumpError).

I even tried doing something a little different:

def func(x,y)
    func(x,y) do |tail|
        ..
    end
end

but no luck

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

红尘作伴 2024-10-10 22:48:49

是的,您可以显式地将块作为参数:

def func(x, y, &block)

您仍然可以使用yield关键字让出它,但您也可以在递归时传递它:

yield(n, func(x, y, &block))

两种情况下的&都意味着< code>block 参数不是普通参数,而是表示可以附加到任何 Ruby 方法调用的块。

Yes, you can take the block as an argument explicitly:

def func(x, y, &block)

You can still yield to it with the yield keyword, but you can also pass it as you recurse:

yield(n, func(x, y, &block))

The & in both cases means that the block argument is not a normal argument, but represents the block that can be attached to any Ruby method call.

梦纸 2024-10-10 22:48:49

您缺少在递归调用中传递块。
递归调用应该如下所示:-

yield(n,func(x,y)) { |x,y| x+y})

由于您错过了在递归调用中传递块,因此当代码命中时:-

     if x.length == 1 then
     n = x.pop()
     yield(n,y) <<<< Here 

在递归调用中,方法 func 没有作为参数传递的块,但 ruby​​ 尝试调用一个不存在的块,因此出现错误。

You are missing to pass the block in the recursive call.
The recursive call should be like as below:-

yield(n,func(x,y)) { |x,y| x+y})

Since you missed to pass the block in the recursive call, when the code hits:-

     if x.length == 1 then
     n = x.pop()
     yield(n,y) <<<< Here 

the method func doesn't have block passed as argument,in the recursive call, but ruby tries to call a non-existent block and hence the error.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文