Can I evaluate a block inside a Proc?

烈酒焚心 提交于 2020-01-01 06:12:49

问题


Can I yield a block inside a Proc? Consider this example:

a = Proc.new do
  yield
end

a.call do
  puts "x"
end

What I'm trying to achieve is to print x, but interpreting this with ruby 2.0 raises LocalJumpError: no block given (yield).


回答1:


No you can't, because the Proc you've created is an independent yield - that is, it's a yield that has no block in its context. Although you can call procs with specified parameters and thereby pass the parameters into the proc, yield doesn't work based on specified parameters; it executes the block found within the proc's closure. And the proc's closure is predefined; it is not modified just because you call it later with a block.

So it's equivalent of just typing 'yield' straight into irb (not within any method definitions) which returns the LocalJumpError: no block given (yield) error.




回答2:


@Rebitzele has explained why your code doesn't work: the yield keyword is shorthand notation for calling an anonymous block that has been passed to a method, and in this case there isn't even a method.

But you can of course give the block a name and then call it like you would call any other callable object:

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

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


来源:https://stackoverflow.com/questions/17818160/can-i-evaluate-a-block-inside-a-proc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!