Ruby: 内部块的屈服不起作用
Ruby: Yielding from an inner block does not work
我正在开发一个 Ruby 项目,该项目在我希望允许其他代码更改部分包装器的地方输出文本。下面是一个简化的例子:
- 输出的外包装由该项目生成
- 内包装由用户指定的代码生成
- 在此内部包装器中,调用
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
基本上,yield
和 Proc#call()
毕竟是非常不同的野兽。
What is going wrong?
yield
将控制转移到传递给方法的块,该方法的定义中出现了 yield
。在您的情况下,yield
没有出现在方法定义中,因此,yield
无处可去。
我正在开发一个 Ruby 项目,该项目在我希望允许其他代码更改部分包装器的地方输出文本。下面是一个简化的例子:
- 输出的外包装由该项目生成
- 内包装由用户指定的代码生成
- 在此内部包装器中,调用
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
基本上,yield
和 Proc#call()
毕竟是非常不同的野兽。
What is going wrong?
yield
将控制转移到传递给方法的块,该方法的定义中出现了 yield
。在您的情况下,yield
没有出现在方法定义中,因此,yield
无处可去。