为什么包含在类外部的模块会将实例方法添加到类的对象中

时间:2016-09-08 13:29:35

标签: ruby

我正在尝试使用Ruby include关键字,如下所示:

module A
    def show
    puts "working"
    end
end

include A

class E
end

class D
end

e = E.new
d = D.new
e.show
d.show

o = Object.new
puts o.respond_to?("show")

******************************output****************

working
working
true

我期待输出为undefined method,但它给了我正确的输出。我还观察到show中定义的module A方法正在成为Object的实例方法。

为什么这些方法成为类Object的实例方法? 请帮助理解这个概念。

1 个答案:

答案 0 :(得分:3)

因为类Class的实例继承自Object

因此,包含在Object中的模块可用于Class个实例的实例(ED类的实例)。

class A
end

module B
  def test; :hi end
end
#=> test

include B
#=> Object

A.new.test
#=> :hi

Object.new.test
#=> :hi

include B写在顶层意味着includeB加入Object

include B最外层的上下文相当于:

class Object
  include B
end

唯一一个实例不共享模块B方法的类是BasicObject