gpt4 book ai didi

Ruby:内部 block 的屈服不起作用

转载 作者:数据小太阳 更新时间:2023-10-29 08:36:28 25 4
gpt4 key购买 nike

我正在开发一个输出文本的 Ruby 项目,我想在其中允许其他代码更改包装器的一部分。下面是一个简化的例子:

  • 输出的外包装由该项目生成
  • Inner wrapper 由用户指定的代码生成
  • 在此内部包装器中,调用 yield 将使项目生成内部内容。

但是,当我尝试运行以下代码时,出现了一个非常奇怪的错误:

def wrapper(&block)
puts "begin outer wrapper"
block.call do
puts "inner content"
end
puts "end outer wrapper"
end

wrapper do
puts "begin inner wrapper"
yield
puts "end inner wrapper"
end

我希望得到以下输出:

begin outer wrapper
begin inner wrapper
inner content
end inner wrapper
end outer wrapper

这不会发生。相反,Ruby 抛出以下错误:LocalJumpError: no block given (yield)

出了什么问题?

编辑:根据@JörgWMittag 的回答,这是一个确实有效的变体:

def wrapper(&block)
puts "begin outer wrapper"
block.call do
puts "inner content"
end
puts "end outer wrapper"
end

wrapper do |&inner_block|
puts "begin inner wrapper"
inner_block.call
puts "end inner wrapper"
end

基本上,yieldProc#call() 毕竟是非常不同的野兽。

最佳答案

What is going wrong?

yield 将控制权转移到传递给 yield 出现在其定义中的方法的 block 。在您的情况下,yield 没有出现在方法定义中,因此,yield 无处可去。

关于Ruby:内部 block 的屈服不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35351410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com