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使用绝对路径,这样可以完全绕过加载路径;

时间: 2024-09-19 11:52:24

Ruby学习笔记-Module的相关文章

ruby学习笔记(11)--symbol与hash参数

symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看 puts "0001".object_id puts "0001".object_id puts "0001".object_id puts "0001".object_id 输出结果类似如下: 32088750320887303208871032088690 可以

Ruby学习笔记_索引贴

学习Ruby也有段时间了,在学习的同时也做了些笔记并发到了园子睐.看到园子里的大虾们在出了一系列文章后都会做个索引贴,这样很方便,所以本人今天抽了个空就把它整理了下,方便自己的同时也方便感兴趣的朋友.   Ruby学习笔记目录: 1.Ruby入门 2.Ruby-循环与选择结构 3.Ruby-String 4.Ruby-Array 5.Ruby-Hash 6.Ruby-Block, Proc and Lambda 7.Ruby-正则表达式 8.Ruby-Symbol 9.Ruby-Method,C

ruby学习笔记(5)-模块module的运用

ruby中的module与.net中的namespace有点类似,可以用来区分同名但属于不同开发者(或组织)的代码. 下面的代码,定义了一个Me模块,里面的sqrt与Math模块中的sqrt重名,另外还有一个重名常量PI #定义一个模块(有点类似.net中的命名空间) module Me def sqrt(num1,num2=-1) return "num1=#{num1},num2=#{num2}" end PI = 3.14; end puts Math::PI #在未includ

ruby学习笔记(1)--初识语法

虽然ruby/ruby on rails从2007年就一直获奖无数,但身为一个中国人,一直对小日本创造的东西不怎么感兴趣,想想其实也没必要,技术本身是无国界的,日本其实也有值得学习的地方(扯远了,呵) 单从技术而言,ruby本身确实很爽,令程序员的工作变得轻松有趣! 下面的代码演示了如何找出100以内的素数: using System; namespace Mersenne { class Program { static void Main(string[] args) { for (int

ruby学习笔记(2)--类的基本使用

ruby语言跟c#的一些重要差别在于: 1.ruby是动态语言,c#是静态语言--即对象在new出来以后,ruby还可以动态给对象实例添加一些属性或方法(javascript也是如此) 2.ruby中刻意弱化了变量类型这个概念,默认情况下变量/方法都不需要声明具体(返回)类型,但其实在ruby内部,会自动根据变量的值分配类型.(可以通过 "puts 变量.class"查看) 3.ruby相对c#来讲,可能有些雷的地方在于:父类中的private成员,居然是可以在子类中使用的! ...其

Ruby学习笔记之Ruby 对象

大部分 Ruby 程序,它们的设计,逻辑,动作,都是围绕着对象进行的.写一个 Ruby 程序,主要的工作就是去创建对象,然后给它们能力,让它们可以去执行动作. Ruby 是 OOP 语言,就是面向对象的语言,你执行的计算,数据处理,输入与输出这些动作,都是通过创建对象,然后让这个对象去执行指定的动作来完成的.对象(object)在现实世界里,就是一个东西.一个苹果是一个对象,一张桌子也是一个对象. 每个对象是一个特定的类的实例(instance),对象的行为大部分是在它们所属的那个类上面定义的方

Ruby学习笔记之Ruby 模块

介绍一种跟类相似的构造:模块(module).在设计程序的时候,我们会把大的组件分割成小块,你可以混合与匹配对象的行为. 跟类差不多,模块也捆绑方法与常量.不一样的是,模块没有实例.你可以把拥有特定功能的模块放到类或某个特定的对象里使用. Class 这个类是 Module 类的一个子类,也就是所有的 class 对象应该也是一个 module 对象. 上午10:26 *** 创建与使用模块 上午10:26 *** module MyFirstModule   def say_hello   p

Ruby学习笔记

Ruby语言中,以对象为基本单位,可以说所有的元素都是对象.按照之前对于面向对象程序的理解,对象是指包含了特定属性和方法集合的一组程序.对象由类来定义,具体的表现为对象实例.也就是说,对象是类的实例化[2]. Ruby语言的基础元素 对象:数值对象.字符串对象.正则表达式对象.时间对象.文件对象.目录对象.数组.哈希.例外对象等 数值对象      由于Ruby中一切数据都是对象,所以我们处理的数字实际上也是对象.      a = 10,这样一个简单的赋值语句,实际上应当理解为 a = Num

Ruby学习笔记二 使用Ruby实现通过Proxy的方式请求网页

现在很多网站上某些活动都有限制同一IP只能投一票的规定,但是有时候迫于 压迫,又不得不想办法多投几票,以前是采用Apache里的HttpClient来实现这些功 能,日前正在看Ruby,就用它也来玩下: require 'net/http' ##获得网页内容 def query_url(url) return Net::HTTP.get(URI.parse(url)); end #抓取cnproxy上所有的代理列表,并将结果保存到proxy.txt中去 #你可以修改这块代码或者其他的代理服务器列