ruby深入研究5

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我们就随时可以对一个对象进行内部探测,包括随时增加、修改一个对象的实例变量,牛逼吧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值