我来自Java,现在我正在使用Ruby.
我不熟悉的一个语言功能是module
.我想知道究竟是module
什么,你什么时候使用一个,为什么要用module
一个class
?
???????????????????????????????????????????????????????????????????????????????
? ? class ? module ?
???????????????????????????????????????????????????????????????????????????????
? instantiation ? can be instantiated ? can *not* be instantiated ?
???????????????????????????????????????????????????????????????????????????????
? usage ? object creation ? mixin facility. provide ?
? ? ? a namespace. ?
???????????????????????????????????????????????????????????????????????????????
? superclass ? module ? object ?
???????????????????????????????????????????????????????????????????????????????
? methods ? class methods and ? module methods and ?
? ? instance methods ? instance methods ?
???????????????????????????????????????????????????????????????????????????????
? inheritance ? inherits behaviour and can? No inheritance ?
? ? be base for inheritance ? ?
???????????????????????????????????????????????????????????????????????????????
? inclusion ? cannot be included ? can be included in classes and ?
? ? ? modules by using the include ?
? ? ? command (includes all ?
? ? ? instance methods as instance ?
? ? ? methods in a class/module) ?
???????????????????????????????????????????????????????????????????????????????
? extension ? can not extend with ? module can extend instance by ?
? ? extend command ? using extend command (extends ?
? ? (only with inheritance) ? given instance with singleton ?
? ? ? methods from module) ?
???????????????????????????????????????????????????????????????????????????????
第一个答案是好的并给出了一些结构性答案,但另一种方法是考虑你正在做什么.模块是关于提供可以在多个类中使用的方法 - 将它们视为"库"(正如您在Rails应用程序中看到的那样).类是关于对象的; 模块是关于功能的.
例如,身份验证和授权系统是模块的好例子.身份验证系统跨多个应用程序级别的类(用户进行身份验证,会话管理身份验证,许多其他类将根据身份验证状态采取不同的行为),因此身份验证系统充当共享API.
当您在多个应用程序之间共享方法时,您也可以使用模块(同样,库模型在这里很好).
我很惊讶有人还没说过这个.
由于提问者来自Java背景(我也是如此),这是一个有用的类比.
类就像Java类一样.
模块就像Java静态类.想想Math
Java中的类.您没有实例化它,并且您重用静态类中的方法(例如Math.random()
).
基本上,模块无法实例化.当一个类包含一个模块时,会生成一个代理超类,它提供对所有模块方法以及类方法的访问.
多个类可以包含一个模块.模块不能被继承,但这种"mixin"模型提供了一种有用的"多重继承"类型.OO纯粹主义者不同意这种说法,但不要让纯度妨碍完成工作.
(此答案最初链接到http://www.rubycentral.com/pickaxe/classes.html
,但该链接及其域名不再有效.)
Module
在Ruby中,在某种程度上,对应于Java 抽象类 - 具有实例方法,类可以从它继承(通过include
,Ruby人称之为"mixin"),但没有实例.还有其他一些细微差别,但这些信息足以让您入门.
名称空间:模块是名称空间 ...在Java中不存在;)
我也从Java和python切换到了Ruby,我记得有完全相同的问题...
因此,最简单的答案是模块是名称空间,Java中不存在该名称空间。在Java中,最接近命名空间的是软件包。
因此,ruby中的模块就像java:
class中的模块一样?没有
界面?没有
抽象类?没有
包吗?也许吧)
Java类内部的静态方法:与ruby模块内部的方法相同
在Java中,最小单位是一个类,您不能在一个类之外有一个函数。但是在ruby中这是可能的(例如python)。
那么模块中包含什么呢?
类,方法,常量。模块在该名称空间下保护它们。
没有实例:模块不能用于创建实例
混合输入法:有时继承模型不适用于类,但在功能方面希望将一组类/方法/常量组合在一起
关于ruby中模块的规则:
-模块名称是UpperCamelCase-
模块中的常量是ALL CAPS(此规则对于所有ruby常量都是相同的,不特定于模块)
-访问方法:use。运算符
-访问常量:使用::符号
模块的简单示例:
module MySampleModule CONST1 = "some constant" def self.method_one(arg1) arg1 + 2 end end
如何在模块内使用方法:
puts MySampleModule.method_one(1) # prints: 3
如何使用模块常量:
puts MySampleModule::CONST1 # prints: some constant
关于模块的其他一些约定:
在文件中使用一个模块(例如ruby类,每个ruby文件一个类)