class_eval和instance_eval的區別

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

相關文章
相關標籤/搜索