4

我可以在 Proc 中产生一个块吗?考虑这个例子:

a = Proc.new do
  yield
end

a.call do
  puts "x"
end

我想要实现的是打印x,但是用 ruby​​ 2.0 raises 来解释它LocalJumpError: no block given (yield)

4

2 回答 2

4

不,你不能,因为你创建的 Proc 是一个独立的yield- 也就是说,它是一个yield在其上下文中没有块的。虽然你可以用指定的参数调用procs,从而将参数传递给proc,yield但不能基于指定的参数工作;它执行在 proc 的闭包中找到的块。并且proc的闭包是预定义的;它不会因为您稍后用块调用它而被修改。

所以这相当于直接在irb(不在任何方法定义中)输入“yield”,它会返回LocalJumpError: no block given (yield)错误。

于 2013-07-23T18:56:20.543 回答
4

@Rebitzele 解释了为什么您的代码不起作用:yield关键字是调用已传递给方法的匿名块的简写符号,在这种情况下甚至没有方法。

但是您当然可以给块起一个名称,然后像调用任何其他可调用对象一样调用它:

a = ->&block { block.() }

a.() do puts 'x' end
# x
于 2013-07-23T22:11:30.893 回答