如果我有一个班级和一个模块:
class Foo
end
module WhackyFoo
def whacky
puts 'shits whacky!'
end
end
为什么我可以这样做:
include WhackyFoo
Foo.new.whacky
# => shits whacky!
有人可以解释或指向解释此用法的Ruby文档吗?
答案 0 :(得分: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)
答案 1 :(得分:1)
最终在对象上调用include
,这就是ruby中的所有东西归结为。由于每个类都继承自Object,因此您在模块中定义的方法最终将包含在每个类中。