#### 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