2013-07-23 63 views
4

我可以在Proc中生成一个块吗?考虑下面这个例子:我可以评估Proc中的块吗?

a = Proc.new do 
    yield 
end 

a.call do 
    puts "x" 
end 

我试图做到的,是打印x,但与红宝石2.0解释这引起了LocalJumpError: no block given (yield)

回答

4

不可以,因为您创建的Proc是独立的yield - 也就是说,它的yield在其上下文中没有任何块。尽管可以使用指定的参数调用proc,并将参数传递给proc,但yield不能根据指定的参数工作;它执行proc闭包内的块。 proc的关闭是预定义的;它不会被修改,只是因为稍后使用块来调用它。

因此,它只是将'yield'直接输入到irb(不在任何方法定义中),它返回LocalJumpError: no block given (yield)错误。

4

@Rebitzele解释为什么你的代码不能工作:yield关键字调用已传递给方法的匿名块速记符号,而在这种情况下,不是连的方法。

不过你当然可以给块一个名称,然后调用它,你会调用任何其它可调用对象:

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

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

仍在试图弄清楚是怎么回事,但是这似乎并没有为我工作:'obj.instance_eval {def wrap(&block); a = - &block {block。()}; a。(){puts'goodbye'};结束}; obj.wrap {puts'hello'; yield}'只会打印'再见' –

相关问题