Ruby边学边记(二)

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;             #可以调用会飞模块的"飞"方法

你可能感兴趣的:(Ruby边学边记(二))