instance_eval()方法的实际其实就一句话:不改变当前上下文的前提下,改变当前self。
class AAA def initialize @v = 1 endenda = AAA.newx = 3puts selfa.instance_eval do puts self @v += x puts @vend
?如上述代码所示,x的作用域应该是main内,结果在a内也能访问。这应该算是扁平作用域的一种高级用法。。
?
class AAA @v = 2 def initialize @v = 1 endenda = AAA.newa.instance_variable_get "@v"AAA.instance_variable_get "@v"
?第一个输出1,第二个输出2. 因为第一个是定义在AAA这个类的作用域中的,第二个是在AAA类的实例方法的作用域中的也就是在实例对象的作用域中的。
?
有了instance_eval我们就随时可以对一个对象进行内部探测,包括随时增加、修改一个对象的实例变量,牛逼吧?