这是我在学习 SoloLearn 的 Ruby Tutorial 时的笔记的第三部分,包括Ruby编程中的面向对象编程知识。具体包括模块、Mixins、标准类与文件。
在本文中我省略了该课程中的一些编程的基础概念,并且将Ruby的语法与其它语言的进行了一些比较,适合已经有一些其它编程语言的基础的朋友阅读。文中的加粗内容表示跟我以前接触过的其它语言(C/C++/Java/Javascript)看起来相似但不一致的地方。由于我水平有限,错误在所难免,如发现错误请在留言内指教,谢谢!
本文在本人新博客的链接:http://www.myblog.link/2017/02/01/Note-of-Ruby-4/
模块、Mixin与标准类
模块作为Mixin与命名空间
-
模块可以用来作为方法的集合来供其它类包含(include)。Ruby不允许一个类继承多个类,但允许一个类包含多个模块。include这个模块之后,该类就包含了这个模块的方法。这样的模块名一般为
动词able的形式。感觉这类似于Java的接口。这样使用的模块被称为mixin。使用module来创建模块,使用include来包含模块。module ModuleName1 # 定义模块ModuleName1 def method1 # 定义模块ModuleName1的方法method1 puts "method1 called" end end module ModuleName2 # 定义模块ModuleName2 def method2 # 定义模块ModuleName2的方法method2 puts "method2 called" end end class ClassName include ModuleName1 # 包含ModuleName1 include ModuleName2 # 包含ModuleName2 end foo = ClassName.new foo.method1 # 调用模块ModuleName1的方法method1,输出 method1 called foo.method2 # 调用模块ModuleName2的方法method2,输出 method2 called -
Comparable模块是Ruby内置的一个mixin。包含该模块并定义了<=>方法的类就可以使用6种比较操作( 运算符<,<=,==,>=,>与方法between?)。<=>方法的规则是:小于返回-1,大于返回1,等于返回0,无法比较返回nil。class MyNumber attr_accessor :val include Comparable # 包含Comparable def <=> other # 定义<=>方法 return @val <=> other.val end end -
模块也可以作为命名空间来使用。模块中可以包含类、常量、类方法。模块中的常量使用
模块名::常量名访问,类使用模块名::类名访问,def self.方法名定义的方法可以用模块名.方法名访问。这样做可以防止命名时的冲突。module MyNamespace CONST = "CONST" # 常量 def self.myMethod # 方法 puts "myMethod called" end class ClassName # 类 def myInstanceMethod puts "instanceMethod in class called" end end end puts MyNamespace::CONST # 使用::访问模块中的常量,输出 CONST MyNamespace.myMethod # 使用.访问模块中的方法,输出 myMethod called foo = MyNamespace::ClassName.new# 使用::访问模块中的类 foo.myInstanceMethod # 输出 instanceMethod in class called
结构体标准类
-
Struct类可以快速生成结构体(不含其它方法的类),将Symbol作为Struct.new的参数,将自动生成相应的实例变量,getter与setter,以及使用这些相应数量参数进行初始化的initialize等方法。Point = Struct.new :x,:y # 使用Struct.new生成类Point,注意大写 foo = Point.new 1,2 # 使用自动生成的类Point创建对象 puts foo # 输出 #<struct Point x=1, y=2> foo.x = 3 # 调用自动生成的@x的setter puts foo.x # 调用自动生成的@x的getter,输出 3 -
OpenStruct类不需要提前定义结构体包含哪些变量,其直接生成 可以直接使用任意getter/setter 的对象。使用OpenStruct类需要添加require "ostruct"。require "ostruct" # 要加这行 foo1 = OpenStruct.new # 无参直接创建对象 foo1.myVal = 1 # 直接使用@myVal的setter puts foo1.myVal # 直接使用@myVal的getter,输出1 # 还能用类似Hash的语法作new的参数来初始化生成的对象,注意没有花括号 foo2 = OpenStruct.new key1:"value1", key2:"value2" puts foo2.key1 # 获取初始化的key1的值,输出value1 foo2.key3 = "value3" # 仍然可以自动生成getter/setter puts foo2.key3 # 输出 value3
标准类Math与Time
-
Math包含数学相关的方法与常量-
方法
acos,acosh,asin,asinh,atan,atan2,atanh,cbrt,cos,cosh,erf,erfc,exp,frexp,gamma,hypot,ldexp,lgamma,log,log10,log2,rsqrt,sin,sinh,sqrt,tan,tanh -
常量
E,PI
-
-
Time包含时间相关的方法与常量