MyBlog 一个关于软件开发与信息安全的个人博客

Ruby学习笔记(四) 模块、Mixins、标准类与文件

2017-02-01

这是我在学习 SoloLearnRuby 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包含时间相关的方法与常量


相关文章

评论