Ruby 为什么要扩展';使用extend时在继承链之前插入s类?
当我使用B扩展A时,A是B的单个实例继承链中的第一个。B在哪里?为什么A是第一个Ruby 为什么要扩展';使用extend时在继承链之前插入s类?,ruby,class,Ruby,Class,当我使用B扩展A时,A是B的单个实例继承链中的第一个。B在哪里?为什么A是第一个 module A end class B extend A class << self p self ##<Class:B> p self.ancestors #[A, Class, Module, Object, Kernel, BasicObject] end end ruby 2.0.0p645中有一个bug,因为我在该补丁级别也得到了以
module A
end
class B
extend A
class << self
p self ##<Class:B>
p self.ancestors #[A, Class, Module, Object, Kernel, BasicObject]
end
end
ruby 2.0.0p645中有一个bug,因为我在该补丁级别也得到了以下输出:
[A、类、模块、对象、内核、基本对象]
2.0.0-p645 :001 > module A
2.0.0-p645 :002?> end
=> nil
2.0.0-p645 :003 > class B
2.0.0-p645 :004?> extend A
2.0.0-p645 :005?> class << self
2.0.0-p645 :006?> p self
2.0.0-p645 :007?> p self.ancestors
2.0.0-p645 :008?> end
2.0.0-p645 :009?> end
#<Class:B>
[A, Class, Module, Object, Kernel, BasicObject]
=> [A, Class, Module, Object, Kernel, BasicObject]
它在irb
中也运行良好:
2.1.0 :001 > module A
2.1.0 :002?> end
=> nil
2.1.0 :003 > class B
2.1.0 :004?> extend A
2.1.0 :005?>
2.1.0 :006 > class << self
2.1.0 :007?> p self
2.1.0 :008?> p self.ancestors
2.1.0 :009?> end
2.1.0 :010?> end
#<Class:B>
[#<Class:B>, A, #<Class:Object>, #<Class:BasicObject>, Class, Module, Object, Kernel, BasicObject]
=> [#<Class:B>, A, #<Class:Object>, #<Class:BasicObject>, Class, Module, Object, Kernel, BasicObject]
2.1.0 :011 >
module A
end
class B
extend A
class << self
p self.ancestors
end
end
运行$ruby module\u祖先.rb
生成:
[#,A,#,#,类,模块,对象,内核,基本对象]
2.0.0-p645 :001 > module A
2.0.0-p645 :002?> end
=> nil
2.0.0-p645 :003 > class B
2.0.0-p645 :004?> extend A
2.0.0-p645 :005?> class << self
2.0.0-p645 :006?> p self
2.0.0-p645 :007?> p self.ancestors
2.0.0-p645 :008?> end
2.0.0-p645 :009?> end
#<Class:B>
[A, Class, Module, Object, Kernel, BasicObject]
=> [A, Class, Module, Object, Kernel, BasicObject]
因此,是的,您的问题不在于代码,而在于ruby实现。为什么
B
应该在这个链中?它不是自身的父级。文档中说“返回mod中包含的模块列表(包括mod本身)。B
是类而不是模块B.singleton_class.祖先35;=>[#,a,#,#,类,模块,对象,内核,基本对象]
。参见A
?你是对的。但为什么自我不能得到同样的结果呢?这也是B.singleton_班。我想你是对的。这是ruby实现的问题。我的ruby版本是ruby 2.0.0p645(2015-04-13)[i386-mingw32]。我在使用irb时得到了与我描述的相同的结果。我正在通过安装您的补丁级别进行测试,将让您知道它是如何运行的。已确认!这是你的ruby补丁级别。p645
的实现中一定存在某种缺陷。看我的修订。
module A
end
class B
extend A
class << self
p self.ancestors
end
end