instance_eval和class_eval
蔡源茂 | 创建:2018-05-24 | 最后更新:2018-05-24 | 693次阅读
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