Ruby 为什么要扩展';使用extend时在继承链之前插入s类?

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,因为我在该补丁级别也得到了以

当我使用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,因为我在该补丁级别也得到了以下输出:

[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