2.1Ruby语言的模块(Module)

模块是方法、常量、类变量的集合。模块遵循标识符的命名规则,一般PascalCase命名法。

  • 模块不能被实例化
  • 模块也不能被子类继承

模块的定义

module 模块名
  模块主体
end
module Mod
  include Math
  CONST = 1
  def meth
    #  ...
  end
end
Mod.class              #=> Module
Mod.constants          #=> [:CONST, :PI, :E]
Mod.instance_methods   #=> [:meth]

场景一:混入(mixin)

在定义类时使用include,模块中的方法、常量、类变量就都能被类引用。

module MyModule
  #共通的方法等
end

class MyClass1
  include MyModule
  # MyClass1 中独有的方法
end

class MyClass2
  include MyModule
  # MyClass2 中独有的方法
end

像上述代码那样,虽然有点类似于类的继承,但mix-in可以更加灵活地解决下面的问题。

  • 虽然两个类拥有相似的功能,但是不希望把它们作为相同的种类(Class)来考虑
  • Ruby不支持父类的多重继承,因此无法对已经继承的类添加共通的功能

场景二:命名空间(namespace)

无论是方法名还是类名,当然是越简洁且有意义越好,但是可能往往同一个名称在很多地方都会使用,因此,通过模块就可以很好地解决命名冲突的问题。命名空间(namespace),就是对方法、常量、类等名称进行区分及管理的单位。由于模块提供不同的命名空间,因此A模块中foo方法与B模块中的foo方法就会被程序认为是两个不同的方法。

#模块如何调用方法和常量
模块名.方法
模块名::常量

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/ruby/rubylang/1541.html

(0)
上一篇 2020年7月31日 23:56
下一篇 2020年8月1日 23:28

相关推荐

  • 1.11Ruby语言的两种闭包(Closure):Proc和Lambda

    形成闭包的两个特征: 块需要调用外围方法的参数或局部变量 外围方法有了返回以后,外围方法的参数或局部变量没有立即被销毁,依然存在于内存中,直至块执行完毕 首先回顾一下:代码块可以使用在其外定义的方法参数和方法局部变量。比如 一旦multiply方法有了返回以后,n方法参数将会被销毁,所以,此时还没有形成闭包。那如何形成…

    Ruby语言教程 2020年7月11日
    06240
  • 1.7Ruby语言的变量(Variable)和常量(Constant)

    变量遵循标识符的命名规则,一般以小写英文字母开头并且全部为小写。 1.全局变量(Global Variable) 以$开头。作用域:全局使用。定义在类和模块之外。 2.类变量(Class Variable) 以@@开头。作用域:可被类(或子类)方法、实例方法(或子类实例方法)使用,可以被子类继承,不可以直接被对象调用。…

    Ruby语言教程 2020年7月7日
    01.1K0
  • 1.3Ruby语言的非操作符(Nonoperator)和操作符(Operator)

    非操作符 Ruby语言包括11个非操作符:圆括号(( ))、方括号([ ])、花括号( { })、圆点(.)、逗号(,)、分号(;)、冒号(:)、双冒号(::)、箭头(=>)、星号(*)、与(&)、小于(<)。 操作符 操作符,又称为运算符。有一个操作数的操作符称为一元操作符,有二个操作数的操作符称…

    Ruby语言教程 2020年7月3日
    01.4K0

发表回复

登录后才能评论