我正在研究一个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()
毕竟是非常不同的野兽。
答案 0 :(得分:4)
出了什么问题?
yield
将控制转移到传递给yield
定义的方法的块。在您的情况下,yield
没有出现在方法定义中,因此,yield
无处可去。