instance_eval和class_eval

蔡源茂 | 创建:2018-05-24 | 最后更新:2018-05-24 | 796次阅读

1. instance_eval

这个方法的调用者必须是对象。instance_eval的执行结果会对当前对象产生效果,相当于是在对象内部执行一段代码。

1.1 调用者是类实例

如果是在instance_eval中定义了一个方法,那么该方法也仅属于该对象,这个方法叫做单例方法

#ruby2.4.1
class A
  def get_a
    @a
  end
end
a = A.new
a.instance_eval do 
  p self #=>#<A:0x983f85c>
  @a = 1
  def get_b
    @b
  end
end
p a.get_a #=>1
p a.get_b #=>undefined method `get_b' for #<A:0x981780c>

1.2 调用者是类时

由于类本身也是Class类的类实例(ruby中一切均是对象)。此时在instance_eval中定义了一个方法,那么该方法也仅属于该类,这个方法叫做类方法

#ruby2.4.1
class A
  @a = 0 #类变量
  def initialize
    @a = 1
  end
  def get_a
    @a
  end
end
A.instance_eval do 
  def get_c
    @a
  end
end
p A.get_c #=> 0

2. class_eval

这个方法的调用者必须是类。class_eval的执行结果会对当前类产生效果。相当于在当前类内部执行了一段代码。
如果在class_eval中定义了一个方法,那么这个方法会成为该类的实例方法

#ruby2.4.1
class A
  def initialize
    @a = 0
  end
  def get_a
    @a
  end
end
a = A.new
A.class_eval do
  p self  #=> A
  def get_b
    @a
  end
end
b = A.new
p b.get_b #=> 1
p a.get_b #=>1


共收到 2 条回复


蔡源茂: | #1 | 2018-05-28

test


风雨彩虹: | #2 | 2018-05-28

test


评论:

忘记密码?
其他账号登录: QQ登录

回到顶部
到达底部