ModuleRuby一个非常好用的功能,它跟Class类别非常相似,你可以在里面定义方法。只是你不能用new来建立它。它的第一个用途是可以当做Namespace来放一些工具方法:

moduleMyUtildefself.foobarputs"foobar"endendMyUtil.foobar#输出foobar

另一个更重要的功能是Mixins,可以将一个Module混入类別之中,这样这个类別就会拥有此Module的方法。这回让我们拆成两个wenji,debug.rbfoobar.rb,然後在foobar.rb中用引用debug.rb

首先是debug.rb:

moduleDebugdefwho_am_i?puts"#{self.class.name}:#{self.inspect}"endend

然后是foobar.rb:

require"./debug"classFooincludeDebug#這個動作叫做MixinendclassBarincludeDebugenda=Foo.newb=Bar.newa.who_am_i?#輸出Foo:#<Foo:0x00000102829170>b.who_am_i?#輸出Bar:#<Bar:0x00000102825b88>

Ruby使用Module来解決多重继承的问题,不同类别之间只要拥有相同的方法,就可以改放在Module里面,然后include它即可。

Java中的interface可以解决多重继承的缺陷,C++是支持多重继承的,而且有一个元友的概念。我认为ruby的include module更像C++的friend class的功能。