ruby 模块
程序员文章站
2022-03-20 21:31:46
ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module...end定义. 实际上...模块的'模块类'...
ruby的模块非常类似类,除了:
模块不可以有实体
模块不可以有子类
模块由module...end定义.
实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看下去吧.
模块有两种用法.其一是将相近的方法和实体放在一个相对集中的域里.ruby标准包里的math模块就扮演着这一角色:
ruby> math.sqrt(2)
1.41421
ruby> math::pi
3.14159
::操作符告诉 ruby 解释器在哪里找常数的值(可以想像,math外的其它模块用pi表示其它的一些东西).如果我们想省掉 :: 直接调用一个模块的方法和常数,我们可以用 include:
ruby> include math
object
ruby> sqrt(2)
1.41421
ruby> pi
3.14159
模块的另一用法是糅和(mixin).某些oo语言,包括c++,允许多重继承(multiple inheritance),即从多个的父类里继承. 现实世界里一个多重继承的例子是闹钟:你可以想像闹钟属于钟类同是属于带蜂音器的事物类.
ruby并未特意实现真正的多重继承,但糅和技术是一很好的替代.记得模块无法实体化或子类化;但如果我们在类定义里include一个方法,
它的方法便实际上已加入,或"糅合"进这个类.
糅合可以视为一种寻求一切我们希望得到的特定属性的方法.举个例子,如果一个类有个 each 方法,把标准库里的enumerable模块糅合进来就自然地赋予我们 sort 和 find 两个方法.
模块的使用令到我们获得多重继承的基本功能却可通过简单的树结构表述类关系,同时也可观地简化了语言的实现(java的设计者也做了一个类似的选择).
模块不可以有实体
模块不可以有子类
模块由module...end定义.
实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看下去吧.
模块有两种用法.其一是将相近的方法和实体放在一个相对集中的域里.ruby标准包里的math模块就扮演着这一角色:
ruby> math.sqrt(2)
1.41421
ruby> math::pi
3.14159
::操作符告诉 ruby 解释器在哪里找常数的值(可以想像,math外的其它模块用pi表示其它的一些东西).如果我们想省掉 :: 直接调用一个模块的方法和常数,我们可以用 include:
ruby> include math
object
ruby> sqrt(2)
1.41421
ruby> pi
3.14159
模块的另一用法是糅和(mixin).某些oo语言,包括c++,允许多重继承(multiple inheritance),即从多个的父类里继承. 现实世界里一个多重继承的例子是闹钟:你可以想像闹钟属于钟类同是属于带蜂音器的事物类.
ruby并未特意实现真正的多重继承,但糅和技术是一很好的替代.记得模块无法实体化或子类化;但如果我们在类定义里include一个方法,
它的方法便实际上已加入,或"糅合"进这个类.
糅合可以视为一种寻求一切我们希望得到的特定属性的方法.举个例子,如果一个类有个 each 方法,把标准库里的enumerable模块糅合进来就自然地赋予我们 sort 和 find 两个方法.
模块的使用令到我们获得多重继承的基本功能却可通过简单的树结构表述类关系,同时也可观地简化了语言的实现(java的设计者也做了一个类似的选择).
上一篇: 无人工干预地自动上传附件
推荐阅读
-
浅析js的模块化编写 require.js
-
以动态模块的方式安装apache2.0.44+PHP4.3.0_PHP
-
php中mysql模块部分功能的简单封装
-
不用float实现div模块居中布局
-
企业会改变ruby 还是Ruby改变企业
-
Webpack4干货分享(一):入口、输入和ES6模块
-
python用模块zlib压缩与解压字符串和文件的方法
-
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
-
《Python 3》--三引号、math模块、cmath模块、日期和时间、转义字符、字符串运算符、字符串格式化、函数、全局变量和局部变量、匿名函数(lambda))
-
详解Angular中的结构型指令、模块和样式