zoukankan      html  css  js  c++  java
  • 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面试常问命令
    图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导
    总结一些牛客网上 的算法岗面试题
    Pytorch-Tensor基本操作
    C++使用代码创建一个Windows桌面应用程序
    Windows中的消息与消息队列
    解决COM组件在WPF设计器中命名空间不存在XXX的问题(附带如何在WPF中使用APlayer引擎)
    Mybatis的一级缓存
    面试题:zookeeper实现分布式锁
    sublime text 文件默认打开格式
  • 原文地址:https://www.cnblogs.com/puresoul/p/2327798.html
Copyright © 2011-2022 走看看