zoukankan      html  css  js  c++  java
  • Ruby1.9中的require问题

    ruby没有像java那种严格的包管理机制,因此引用起来就有些让人摸不着头脑,所以有人说ruby不适合用于多人协作的大项目,这是有一定道理的。
    ruby加载其它的类,一般是通过require来加载的,如:

    Ruby代码  收藏代码
    1. require 'dbi'  
    2. require "rexml/document"  



    但是上面加载的是标准类库里面的文件,当然也可以是已安装的gems文件,但是如果是自己在本地写的文件,就不能直接用require了,如有一个hello.rb文件要引用当前目录的print.rb文件内的类或方法,就不能用require,而应该这样:

    Ruby代码  收藏代码
    1. require_relative "print"  



    但是这个如果想直接通过require的方式来引用也是有办法的,那就是在文件头部将当前目录作为ruby加载的路径:

    Ruby代码  收藏代码
    1. $LOAD_PATH.unshift(File.dirname(__FILE__)) unless $LOAD_PATH.include?(File.dirname(__FILE__))  
    2. require "print"  


    其中File.dirname(__FILE__)代表当前路径,而$LOAD_PATH.unshift方法的目的就是将当前目录作用ruby标准的加载路径。

    总的来说,ruby的加载方式并没什么大的问题,虽然看起来没java包管理机制那样简洁,但java那种包管理机制也的确不太适合用于ruby 这种动态语言,因为它太庸长了,但java默认就可以使用当前目录的类而不需要import导入,从这点来说,还是个不错的特性。

    *************************************************************************************************************************************************************************************************

    require一般用来加载其它的类,如:
    #Ruby代码  :

    require 'dbi'  
    require "rexml/document"
    

    但是上面加载的是标准类库里面的文件,当然也可以是已安装的gems文件,
    但是如果是自己在本地写的文件,就不能直接用require了,
    而应该这样:

    #E7.4-1.rb Module(模块)
    module Module1
      def sqrt(num, rx=1, e=1e-10)
        num*=1.0
        (num - rx*rx).abs <e ? rx : sqrt(num, (num/rx + rx)/2, e)
      end
    end
    
    #E7.4-2.rb Person 类
    class Person
      def talk
        puts "I'm talking."
      end
    end
    
    #用require_relative加载本地Ruby文件
    require_relative "E7.4-1"
    require_relative "E7.4-2" 
    
    class Student < Person
      include Module1
    end
    
    aStudent=Student.new
    aStudent.talk # I'm talking.
    puts aStudent.sqrt(77,2) # 8.77496438739435
    

     #但是这个如果想直接通过require的方式来引用也是有办法的,那就是在文件头部将当前目录作为ruby加载的路径:
    #其中File.dirname(__FILE__)代表当前路径,而$LOAD_PATH.unshift方法的目的就是将当前目录作用ruby标准的加载路径

    $LOAD_PATH.unshift(File.dirname(__FILE__)) unless $LOAD_PATH.include?(File.dirname(__FILE__))  
    require "E7.4-1" 
    require "E7.4-2" 
    
    class Student < Person
      include Module1
    end
    
    aStudent=Student.new
    aStudent.talk # I'm talking.
    puts aStudent.sqrt(77,2) # 8.77496438739435
    
    $LOAD_PATH.unshift(File.dirname(__FILE__)) unless $LOAD_PATH.include?(File.dirname(__FILE__))
    
    #这个改成 $: << '.' 就行。
    $: << '.'
    
    File.expand_path(File.join(File.dirname(__FILE__),’..’,’..’,'page’,'client_arithmetic’))
    

    1、$LOAD_PATH 指的是Ruby读取外部文件的一个环境变量,其实和windows的环境变量是一个概念。Ruby会在这个环境变量的路径中读取需要require的文 件,如果在环境变量中找不到自己想要的文件,就会报LoadError错误。还有$LOAD_PATH和$:指的都是同一个环境变量,是一样一样的。

    2、__FILE__指的是当前rb文件所在目录的相对位置。

    3、File.join是把自己的参数组成一个目录形式的方法,如上面就组成“xxx/http://www.cnblogs.com/page/client_arithmetic”(xxx代码rb文件的相对位置)

    4、 File.expand_path就是把其参数从相对路径转化为绝对路径的方法。

    5、$LOAD_PATH.unshift  就是把上面得出的绝对路径加到现在已经存在所有环境变量之前。

    (--***-曾经受过的伤,觉得一辈子也忘不了,可还是都过来了。曾经离开的人,以为一辈子也放不开,可后来还是发现,原来真的不会,离开谁就活不下去。曾经说着的梦想,你也没能实现,可是却在实现梦想的努力中,找到了喜欢的那个自己。-***-)
  • 相关阅读:
    【函数】wm_concat包的订制
    【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)
    【技巧】如何使用客户端发布BLOG+如何快速发布微信公众号文章
    【故障处理】队列等待之TX
    【转载】TX
    【转载】Linux磁盘管理:LVM逻辑卷管理
    【索引】Oracle之不可见索引和虚拟索引的比对
    小麦苗微信公众号文章链接地址
    Oracle 11g新特性direct path read引发的系统停运故障诊断处理
    常识之外:全表扫描为何产生大量 db file sequential read 单块读?
  • 原文地址:https://www.cnblogs.com/huzhiwei/p/2408484.html
Copyright © 2011-2022 走看看