0

如果我有一个类和一个模块:

class Foo
end

module WhackyFoo
  def whacky
    puts 'shits whacky!'
  end
end

为什么我可以这样做:

include WhackyFoo
Foo.new.whacky
# => shits whacky!

有人可以解释或指出我解释这种用法的 Ruby 文档吗?

4

2 回答 2

4

因为当您在顶层包含模块时,它会被包含在一个特殊的对象main中。上定义的任何方法main(包括那些包含在模块中的方法)都成为Object(因此,所有对象)的私有实例方法。这就是它起作用的原因。

如果您将模块包含到“普通”类(不是顶级main)中,它的行为与您预期的一样

module WhackyFoo
  def whacky
    puts 'shits whacky!'
  end
end

class Foo
end

class Bar
  include WhackyFoo
end


Bar.new.whacky # >> "shits whacky!"

Foo.new.whacky # ~> -:16:in `<main>': undefined method `whacky' for #<Foo:0x007fa92984d968> (NoMethodError)
于 2012-12-07T17:52:14.467 回答
1

最终include在 Object 上调用,这就是 ruby​​ 中的一切归结为。由于每个类都继承自 Object,因此您在模块中定义的方法最终将包含在每个类中。

于 2012-12-07T17:52:31.020 回答