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

Ruby: Yielding from an inner block does not work

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

但是,我在尝试 运行 以下代码时遇到一个非常奇怪的错误:

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。在您的情况下,yield 没有出现在方法定义中,因此,yield 无处可去。