Ruby:从内部块中产生不起作用

时间:2016-02-11 22:33:34

标签: ruby lambda yield proc

我正在研究一个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

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

1 个答案:

答案 0 :(得分:4)

  

出了什么问题?

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