我可以评估Proc中的块吗?

时间:2013-07-23 18:27:44

标签: ruby proc yield-keyword

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

a = Proc.new do
  yield
end

a.call do
  puts "x"
end

我想要实现的是打印x,但使用ruby 2.0解释此问题会引发LocalJumpError: no block given (yield)

2 个答案:

答案 0 :(得分:4)

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

所以它只是直接在irb(不在任何方法定义中)输入'yield'而返回LocalJumpError: no block given (yield)错误。

答案 1 :(得分:4)

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

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

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

a.() do puts 'x' end
# x