You’re probably wondering where the block picks up its bindings. When you define the block, it simply grabs the bindings that are there at that moment, and then it carries those bindings along when you pass the block into a method.
补充一哈交流交流,本质上应该是变量作用域的问题吧~ Ruby 中的 block 和 proc 应该都是能够实现扁平作用域和共享作用域的方式,如果在其外已经定义了 local variable,那么在其内是可以共享到定义变量的 scope 的,但是如果没有在其外定义而是在其内定义,那么这个内部定义的 local variable 的 scope 只在 block 或 proc 内。所以就有了上面你说的不同位置定义 x 最终值不同的问题。
关于上下文环境绑定的问题,类似机制应该不局限于闭包,来段《Ruby 元编程》中抄来的代码。
classMyClassdefmy_method"original my_method()"enddefanother_methodmy_method# using has not been called, so still the original my_methodendendmoduleMyClassRefinementrefineMyClassdodefmy_method"refined my_method()"endendendusingMyClassRefinementMyClass.new.my_method# => "refined my_method()"MyClass.new.another_method# => "original my_method()"