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

相关文章
相关标签/搜索