#### instance_eval从名字上看,它的调用者必须是一个实例:ruby
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类自己.this
class A end A.class_eval do self # => A # current class => A end
根据这个定义,若是在一个类上调用了class_eval,就能够在其中定义该类的实例函数 instance_methodblog
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/2442it