• Ruby学习笔记Module


    Module:

      模块的定义和类比较相似,使用module关键字。但模块不能被实例化,也不能被子类化,模块是独立的,且一个模块对像是Module类的一个实例。模块最常用的两个用途是作为命空间和混入(mixin)。 

         在模块中,可以定义实例变量、实例方法、类变量、类方法和属性等,并且在模块中还可能以定义类和模块。在类中也可以定义模块。 

         在访问模块中的实例成员,需要在类中饱含模块,然后实例化类以访问模块的实例成员。

                  module FirstModule

                        def go

                             puts "Go home"

                        end

                        def self.show   #or FirstModule.show

                             puts "It's a red car."

                        end

          end

          FirstModule.show    #It's a red car.

        class Car

                        include FirstModule              #在类中插入

        end

        car = Car.new

        car.go         #Go home

    a)模块内方法调用:

      module Test

          def self.function

            puts “ this is function test”

          end

          end

        调用:Test.function

      module Test2

         class TestClass

            def performance

               puts “this is performance test”

            end

         end

      end

        调用:Test2::TestClass.new.performance

    b)模块常量调用

      module TestConst

         PI = 3.14

      end

      调用:TestConst::PI

    c) 模块用于命令空间(Namespace):防止命令冲突,这个就不多说了。

    d) 模块用于混入(Mixins):

      目的是实现多继承在类中混入模块和从基类继承非常相似,为的实例对像都可以调用实例成员,上面也提到了。在类中可以包含多个模块,但是类却不能继承自多个类。当需要给类的实例添加很多附加功能,且不想把这些功能全部放在基类中时,就可以使用模块来组织代码。

    e) 加载和请求模块

          i.  有时会把不同的类或模块存放在不同的文件中,在使用这些文件时,就需要使用load和require来加载这些文件。在使用文件中的模块和对象时,还需要使用include和extend方法。 

          ii. require 和 load的区别

      1. load方法参数要求是包括文件扩展名的完整文件名,require则只需要传入库的名字,不需要像文件名那样的后缀;
      2. load把一个文件加载多次,而require则最多只能加载一次;
      3. require方法不公可以加载ruby源文件,还可以加载其它语言编写的源文件;load方法的作用就是复制和粘贴;

          iii.   include方法:

        该方法主要用来将一个模块插入(混入)到一个类或者其它模块。在类定义中引入模块,使模块中的方法成为类的实例方法;这个模块的方法在引入它的类或模块中以函数的形式调用,include 并非将模块的实例方法简单 拷贝到类中, 而是建立了一个类到模块的引用。,如;

      模块,文件名为:TestModule

        module Foo

            def hello

               puts "This is my first module in Ruby!"

            end

           end

      另有一个类文件名为:Test                #Test类和TestModule模块在同一路径下

        #require  "D:/cucumber/Ruby/Module"      #(加载文件)绝对路径

        require “../Ruby/Module"                           #(加载文件)相对路径

        class TestOne

            include Foo               #混入模块

              def hi

                  puts "This is a class"

              end

        end 

        a=TestOne.new

        a.hi

        a.hello

           iv. extend方法:

        extend 用来在一个对象(object,或者说是instance)中引入一个模块,这类从而也具备了这个模块的方法,如:

            module FirstModule

                 def helloMod

                       puts "This is a module."

                 end

        end

        class FirstClass

                 def helloClass

                     puts  "This is a class."

                 end

        end 

       c=FirstClass.new

       c.helloClass        #This is a class.

       c.extend(FirstModule)

       c.helloMod          #This is a module.

           v.   加载路径

        Ruby的加载路径是一个数组,可以使用全局变量$LOAD_PATH 或 $:进行访问。数组的每个元素都是一个目录史,ruby在这些目录中查找加载的文件,前面的目录比后面的目录优选被查找;可以使用 puts $: 输出路径;Ruby程序也可以通过修改$LOAD_PATH($:)数组的内容来修改加载路径;如:

           puts $:

       $: << "../.."           #修改加载路径的值

       puts"@@@@@@@"

         puts $:             

      当然,我们可以对load或require使用绝对路径,这样可以完全绕过加载路径;

  • 相关阅读:
    Linux查看物理CPU个数、核数、逻辑CPU个数
    shell脚本中格式化日期
    MySQL中常用字符串函数
    Xtrabackup 使用方法
    LinuxShell算术运算
    mysql高可用方案MHA介绍
    CentOS安装scp命令
    源码编译安装MySQL
    mysql编译参数详解(./configure)
    SparkStreaming 结合Kafka 时丢数据
  • 原文地址:https://www.cnblogs.com/puresoul/p/2327798.html
Copyright © 2020-2023  润新知