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
这两个陈述都是真的。是否有两个相同方法的副本?一个在SubClass&#39;单身类和SuperClass中的另一个&#39;单身课?
运行此代码时,我希望第二个语句返回false,因为我认为ruby将使用SuperClass中定义的方法。单身课程。
这实际上是如何运作的?
答案 0 :(得分:1)
该方法只有一个副本。
SubClass
和SuperClass
都是Class
的实例。如果你在IRB中检查单例类,你会看到类似的东西:
> SuperClass.singleton_class
=> #<Class:SuperClass>
> SubClass.singleton_class
=> #<Class:SubClass>
SuperClass.singleton_class
是SubClass.singleton_class
的祖先,就像SuperClass
是SubClass
的祖先一样。换句话说:类也是实例(Class),并且使用相同的规则。
instance_methods
采用可选参数这些规则说SubClass.singleton_class.instance_methods
将返回每个可用的实例方法,无论哪个祖先定义它。如果您只想查看SubClass.singleton_class
上定义的实例方法,则需要调用SubClass.singleton_class.instance_methods(false)
。
http://ruby-doc.org/core-2.4.1/Module.html#method-i-instance_methods
答案 1 :(得分:0)
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
的参数只显示该类中定义的方法。