[转帖]Ruby1.9中的require问题_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3301 | 回复: 0   主题: [转帖]Ruby1.9中的require问题        下一篇 
zhongwei.wang
注册用户
等级:中校
经验:1859
发帖:60
精华:1
注册:2013-12-23
状态:离线
发送短消息息给zhongwei.wang 加好友    发送短消息息给zhongwei.wang 发消息
发表于: IP:您无权察看 2013-12-25 14:59:16 | [全部帖] [楼主帖] 楼主

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

ruby加载其它的类,一般是通过require来加载的,如:

Ruby代码:

1. require 'dbi'  

2. require "rexml/document"  

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

Ruby代码:

require_relative "print"


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

Ruby代码:

$LOAD_PATH.unshift(File.dirname(__FILE__)) unless $LOAD_PATH.include?(File.dirname(__FILE__))
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
defsqrt(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
deftalk
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  就是把上面得出的绝对路径加到现在已经存在所有环境变量之前。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论