Ruby模块包含

时间:2012-12-07 17:48:44

标签: ruby module

如果我有一个班级和一个模块:

class Foo
end

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

为什么我可以这样做:

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

有人可以解释或指向解释此用法的Ruby文档吗?

2 个答案:

答案 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,因此您在模块中定义的方法最终将包含在每个类中。