代码之家  ›  专栏  ›  技术社区  ›  Asad Moosvi

对于Ruby中的类方法,继承是如何工作的?

  •  2
  • Asad Moosvi  · 技术社区  · 9 年前
    class SuperClass
      def self.superclass_method
        puts "I am the superclass method."
        puts "self = #{self}"
      end
    end
    
    class SubClass < SuperClass
    end
    
    puts SubClass.singleton_class.instance_methods.include? :superclass_method # true
    puts SuperClass.singleton_class.instance_methods.include? :superclass_method # true
    

    在运行这段代码时,我希望第二条语句返回false,因为我认为ruby将使用在超类的singleton类中定义的方法。

    2 回复  |  直到 9 年前
        1
  •  1
  •   cainlevy    9 年前

    该方法只有一个副本。

    1.Singleton类是实例

    SubClass SuperClass Class 。如果您检查IRB中的singleton类,您将看到如下内容:

    > SuperClass.singleton_class
    => #<Class:SuperClass>
    > SubClass.singleton_class
    => #<Class:SubClass>
    

    这个 SuperClass.singleton_class SubClass.singleton_class 就像那样 超类 子类

    2. instance_methods

    这些规则说 SubClass.singleton_class.instance_methods 将返回每个可用的实例方法,无论是哪个祖先定义的。如果您只想查看在上定义的实例方法 SubClass.singleton_类 ,您需要调用 SubClass.singleton_class.instance_methods(false) .

    http://ruby-doc.org/core-2.4.1/Module.html#method-i-instance_methods

        2
  •  0
  •   Asad Moosvi    9 年前
    class SuperClass
      def self.superclass_method
        puts "I am the superclass method."
        puts "self = #{self}"
      end
    end
    
    class SubClass < SuperClass
    end
    
    p SuperClass.singleton_class.instance_methods(false) # => [:superclass_method]
    p SubClass.singleton_class.instance_methods(false) # => []
    

    superclass_method 实际上仅在中定义 SuperClass.singleton_class 。默认情况下,参数为 instance_methods 为true,它显示了在超类中定义的方法以及在其调用的类中定义的方法 false