Ruby中的类方法继承是如何工作的? 类超类 def self.superclass_方法 “我是超类方法。” 放置“self={self}” 结束 结束 类子类SuperClass.singleton\u类 => # >子类.singleton_类 => #

Ruby中的类方法继承是如何工作的? 类超类 def self.superclass_方法 “我是超类方法。” 放置“self={self}” 结束 结束 类子类SuperClass.singleton\u类 => # >子类.singleton_类 => #,ruby,inheritance,Ruby,Inheritance,这两个语句都返回true。同一方法有两个副本吗?一个在子类“singleton类”中,另一个在超类“singleton类”中 运行此代码时,我希望第二条语句返回false,因为我认为ruby将使用在超类的singleton类中定义的方法 这实际上是如何工作的?该方法只有一个副本 说明: 1.单例类是实例 子类和超类都是类的实例。如果您检查IRB中的singleton类,您将看到如下内容: class SuperClass def self.superclass_method puts

这两个语句都返回true。同一方法有两个副本吗?一个在子类“singleton类”中,另一个在超类“singleton类”中

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


这实际上是如何工作的?

该方法只有一个副本

说明: 1.单例类是实例
子类
超类
都是
的实例。如果您检查IRB中的singleton类,您将看到如下内容:

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
>SuperClass.singleton\u类
=> #
>子类.singleton_类
=> #
超类.singleton_类
子类的祖先。singleton_类
超类
子类
的祖先一样。换句话说:类也是(类的)实例,并且按照相同的规则工作

2. <代码>实例\方法采用可选参数 这些规则表示,
子类.singleton\u类.instance\u方法
将返回所有可用的实例方法,不管是哪个祖先定义的。如果您只想查看在
子类.singleton\u类
上定义的实例方法,则需要调用
子类.singleton\u类.instance\u方法(false)

类超类
def self.superclass_方法
“我是超类方法。”
放置“self={self}”
结束
结束
类子类<超类
结束
p超类。单例_类。实例_方法(false)#=>[:超类_方法]
p SubClass.singleton_class.instance_方法(false)#=>[]

superclass\u方法
实际上只在
superclass.singleton\u类
中定义。默认情况下,
instance\u methods
的参数为true,它显示在超类中定义的方法以及在调用它的类中定义的方法。通过传递它,
false
参数只显示该类中定义的方法

是的,但该方法似乎位于
超类.singleton_类
子类.singleton_类
中。为什么?它实际上在这两个类的方法表中吗?或者它只是在
超类.singleton_类
中,带有一个从
子类.singleton_类
的方法表指向
超类.singleton_类
的方法表的指针?@AsadMoosvi更新了答案,加入了更多关于
实例_方法
的信息。这更有帮助吗?
> SuperClass.singleton_class
=> #<Class:SuperClass>
> SubClass.singleton_class
=> #<Class:SubClass>
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) # => []