Ruby边学边记(二)
Ruby模块
模块在Ruby里面有两个作用
- 把功能相同的方法放在同一个名称之下
- 方便调用方法
模块(Module)是一种把方法、类和常量组合在一起的方式。模块(Module)为您提供了两大好处。
- 模块提供了一个命名空间和避免名字冲突。
- 模块实现了 mixin 装置。
模块(Module)定义了一个命名空间,相当于一个沙盒,在里边您的方法和常量不会与其他地方的方法常量冲突。
模块类似与类,但有一下不同:
- 模块不能实例化
- 模块没有子类
- 模块只能被另一个模块定义
1.模块示例
创建一个Hello模块的范例
模块方法定义与类方法定义类似。
ruby中的module与.net中的namespace有点类似,可以用来区分同名但属于不同开发者(或组织)的代码。
#!/usr/bin/ruby
module Hello #模块名的首写字母与类一样都必须大写
include Math #包含一个模块(可以理解为c#中的引用命名空间),假设Math模块中有sqrt方法
def self.hello_python #self为关键字
print "Hello Python!"
end
def self.hello_ruby
print "Hello Ruby!"
end
name = "Ruby"
end
puts Hello::name #引用常量用双冒号
puts Math::sqrt() #通过完整引用来调用Math中的sqrt方法
puts Math.sqrt() #效果与上面相同
Hello.hello_python
Hello.hello_ruby #调用模块中的方法
这里用一个案例说明可能会更好理解
定义一个鸭子类,会游泳,有游泳方法;野鸭不仅会游泳还会飞;黑鸭就是普通的鸭子;所以可以这么设计:
#鸭子类
class Duck
def swim
print self.class , " can swim...\n";
end
end
#"会飞的"模块
module FlyModule
def fly
print " and I can fly...\n"
end
end
#野鸭(会飞,会游)
class Mallard < Duck
include FlyModule #导入模块后,该类即具有模块中定义的方法(可以理解为实现了接口)
end
#黑鸭(只会游泳)
class Coot < Duck #继承Duck类
def Color
"Black"
end
end
aCoot = Coot.new #实例化黑鸭对象
aCoot.swim; #可以调用基类鸭子的swim方法
aMallard = Mallard.new #实例化野鸭对象
aMallard.swim;
aMallard.fly; #可以调用会飞模块的"飞"方法