【发布时间】:2016-05-22 22:36:39
【问题描述】:
我正在开发一个输出文本的 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() 毕竟是截然不同的野兽。
【问题讨论】: