zoukankan      html  css  js  c++  java
  • class_eval和instance_eval的区别

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

  • 相关阅读:
    PAT 1036 Boys vs Girls (25分) 比大小而已
    idea创建maven项目慢的原因以及解决方案
    git diff 理解
    git status 命令详解
    java注解
    单例模式
    io分类
    数据库设计的范式
    mysql约束
    mysql去重复关键字distinct的用法
  • 原文地址:https://www.cnblogs.com/perish/p/3977172.html
Copyright © 2011-2022 走看看