新人学ruby---ruby中的模块
2015-09-29 00:03
429 查看
模块
模块是什么
ruby同JAVA一样只支持单继承,每个类只能有一个父类,为了提高程序的灵活性ruby引入了 模块 为实现多重继承提供了可能。模块可以说是类的一个补充,但是模块于类有两个不同:
模块不能拥有实例
模块不能被继承
如何创建模块
关键字:module
语法规则:
module 模块名模块的定义
end
注意:
模块名必须是大写字母开头模块的作用
提供命名空间(解决重名问题)
这个个人理解类似JAVA的包,用于对方法,常量,类等名称进行区分及管理。模块提供独立的命名空间,例如模块A中的say_hello方法和模块B中的say_hello方法是属于不同的方法。例子:
module HelloModule # 定义常量 Version = 'v1.0' # 定义方法 def say_hello(name) puts "hello,#{name}" end # 指定say_hello 方法为模块函数 module_function :say_hello end
注释:
module_function: 的作用是把方法作为模块函数公开给外部使用,module_function后面跟的参数是方法名。
利用Mix-in扩展功能(解决ruby单继承)
什么是Mix-in?
Mix-in 就是将模块混合到类中。在定义类时使用include,从而在类中可以使用模块里的常量、方法等例子1:使用关键字 include 使类包含模块
代码:
module Mod def meth puts "这是module" end end class ModuleDemo01 include Mod end mod = ModuleDemo01.new mod.meth
输出:
这是module
如果想校验类是否包含某个模块可以用如下方式:
类名.include?(模块名) 返回true or false.
使用Mix-in 时方法的查找顺序
1)同继承关系一样,类自身已经定义了同名方法时,优先使用类自身的方法。例子:
module Mod def meth puts "这是module" end end class ModuleDemo01 include Mod def meth puts "这个是类的方法" end end mod = ModuleDemo01.new mod.meth
输出:
这个是类的方法
2)一个类中包含多个模块,优先使用最后一个包含的模块
例子:
module Mod1 def meth puts "这是Mod1" end end module Mod2 def meth puts "这是Mod2" end end class ModuleDemo01 include Mod1 include Mod2 end mod = ModuleDemo01.new mod.meth
输出:
这是Mod2
3)多级嵌套include时,查找顺序也是线性的。
例子:
module Mod1 def meth puts "这是Mod1" end end module Mod2 def meth puts "这是Mod2" end end module Mod3 include Mod2 end class ModuleDemo01 include Mod1 include Mod3 end mod = ModuleDemo01.new mod.meth p ModuleDemo01.ancestors
输出:
这是Mod2
[ModuleDemo01, Mod3, Mod2, Mod1, Object, Kernel, BasicObject]
注释: 通过 类名.ancetores方法可以查看该类的继承关系和顺序。
4)如果相同模块被包含两次以上(含两次),则第二次后的会被忽略。
例子:
module Mod1 def meth puts "这是Mod1" end end module Mod2 def meth puts "这是Mod2" end end module Mod3 include Mod2 include Mod1 include Mod2 end class ModuleDemo01 include Mod1 include Mod3 end mod = ModuleDemo01.new mod.meth p ModuleDemo01.ancestors
输出:
这是Mod1
[ModuleDemo01, Mod3, Mod1, Mod2, Object, Kernel, BasicObject]
通过Mix-in 解决ruby单继承问题
其实从上面例子就可以看出,一个类可以多个include多个模块,并拥有模块的方法,下面这个例子可以更直接看出:例子:
module Mod1 def meth puts "这是Mod1" end end module Mod2 def meth puts "这是Mod2" end end module Mod3 include Mod2 include Mod1 def meth3 puts "这个Mod3的meth3" end end class ModuleDemo01 include Mod1 include Mod3 end mod = ModuleDemo01.new mod.meth mod.meth3
输出:
这是Mod1
这个Mod3的meth3
参考来源:《ruby基础教程》
相关文章推荐
- 红宝石(Ruby)史话
- Ruby简明教程之循环语句介绍
- ruby 一些简单的例子
- Ruby 之 class 中的 private、 protected、public
- Ruby中操作文件的方法介绍
- Ruby中的集合编写指南
- CentOS 6.3下编译安装Ruby 2.0笔记
- Ruby编程中关于中断和返回的用法教程
- Ruby中的异常处理代码编写示例
- Ruby中的变量学习总结
- 几个加速Ruby on Rails的编程技巧
- Ruby配置rspec和RestClient来检测服务器
- 分析Cache 在 Ruby China 里面的应用情况
- Ruby中数组的一些相关使用方法
- 编写Ruby代码注释时需要注意的一些问题
- Ruby类继承、抽象类、类拓展混入、代理类实例
- Ruby简明教程之方法(Method)介绍
- 比较详细的ruby symbol 学习资料
- Ruby定义私有方法(private)的两种办法