如果我有一个类和一个模块:
class Foo
end
module WhackyFoo
def whacky
puts 'shits whacky!'
end
end
为什么我可以这样做:
include WhackyFoo
Foo.new.whacky
# => shits whacky!
有人可以解释或指出我解释这种用法的 Ruby 文档吗?
因为当您在顶层包含模块时,它会被包含在一个特殊的对象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)
最终include
在 Object 上调用,这就是 ruby 中的一切归结为。由于每个类都继承自 Object,因此您在模块中定义的方法最终将包含在每个类中。