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