您的位置:首页 > 其它

class_eval和instance_eval的区别

2014-09-17 15:13 375 查看
#### instance_eval从名字上看,它的调用者必须是一个实例:

class A
end
a = A.new
a.instance_eval do
self #===>a
def method1
puts "it's a's instance method, only for a"
end
end

a.method1 #=it's a's instance method, only for a


同样,因为类class本身也是Class类的一个实例,instance_eval也可以用在类上,这个时候就可以在其中定义该类的singleton_method,即为该类的类函数.

class A
end
A.instance_eval do
self # A
def method1
puts "it's A's class method"
end
end

A.method1 # it's A's class method


#### class_eval 的调用者receiver必须是一个,而在class_eval block的内部,self即为receiver类本身.

class A
end

A.class_eval do
self  # => A
# current class => A
end


  根据这个定义,如果在一个类上调用了class_eval,就可以在其中定义该类的实例函数 instance_method

class A
end

a = A.new
a.method1
#=> NoMethodError: undefined method `method1' for #<A:0x10043ff70>

A.class_eval do
self  # => A
# current class => A
def method1
puts 'this is a instance method of class A'
end
end

a.method1
#=> this is a instance method of class A


  详细讲解:https://ruby-china.org/topics/2442
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: