2

我想知道,为什么包含模块的方法会混入任何后续的类定义中(就好像该类本身包含它一样)?

module Foo
  def bar
    print "#{self}\n"
  end
end

class Bar
end

begin
  Bar.bar
rescue NoMethodError
  puts "There is no Bar.bar\n"
end

include Foo

bar
Bar.bar
Bar.new.bar

印刷:

没有Bar.bar
主要的
酒吧
#<栏:0xb73f2048>

这是预期的行为吗?为什么?

4

2 回答 2

2

当您在程序中包含 Foo 但在任何类或方法之外时,它会包含在当前范围内,即main对象。

您可以通过将 bar 方法修改为以下来测试这一点

  def bar
    print "InBar class: #{self.class} value: #{self}\n"
  end

然后在最后添加以下两行

2.bar
Fixnum.bar

这将为您提供以下输出

There is no Bar.bar
InBar class: Object value: main
InBar class: Class value: Bar
InBar class: Bar value: #<Bar:0x21ecec>
InBar class: Fixnum value: 2
InBar class: Class value: Fixnum
于 2010-07-24T16:18:08.423 回答
2

include顶层的 a 将模块混合到Object. 只要它混入Object其中,它就可以作为所有东西的实例方法使用。

于 2010-07-24T16:54:20.350 回答