Ruby中循环引用的检查方法

我们知道在Ruby中要引用外部库,有两种方法:require和load。
他们的作用都是从外部引用一个库到本文件中,区别是require是仅引用一次,多次require不会重复加载文件,且require不需要后缀,如:要引用a.rb文件,则:

rquire 'a'

而load会重复加载,load一次加载一次文件,且load要写全文件名称:

load 'a.rb'

详细的关于require和load的区别可以参考ruby require vs load

我们还知道,要使用require需要将文件放到ruby的lib目录下,还有一种方式就是修改ruby的$LOAD_PATH,实际上require就是修改了$LOAD_PATH,$LOAD_PATH的另外一种表达方式是 $:,我们可以输出这两个变量

1.9.3-p125 :002 > $LOAD_PATH
=> ["~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/x86_64-darwin11.4.0", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/vendor_ruby/1.9.1", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin11.4.0", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/vendor_ruby", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/x86_64-darwin11.4.0"]
1.9.3-p125 :003 > $:
=> ["~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/x86_64-darwin11.4.0", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/vendor_ruby/1.9.1", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin11.4.0", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/vendor_ruby", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1", "~/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/x86_64-darwin11.4.0"]
1.9.3-p125 :004 >

好了,现在我们要require自己的文件怎么办?一般的ruby项目中都有多个文件且他们之间有依赖关系,如a.rb依赖b.rb。我们不能使用require,require对目录有要求。在ruby 1.9版本中提供了require_relative,可以指定相对或绝对路径,不一定要是在ruby的系统目录下。如:

#!/usr/local/ruby/bin/ruby
require_relative './main_service'

#start....
pmu_server = PMU_Service::PMUServer.get_instance
pmu_server.start_fcgi

要注意的问题是,当项目越来越大的文件越来越多的时候,这时候依赖关系会越来越复杂,容易出现循环依赖。
ruby是动态语言不能提前编译发现问题,但是,实际上是有替代方法的。
我们可以把项目中所有文件串起来,执行 ruby -w ,-w的意思是输出告警,相当于是语法检查,也相当于编译的效果了。

当代码有循环引用的时候,ruby -w也可以检查出来:

~/uproject/utopia-project-code/main/source/server/service/pmu_service/user_handler.rb:6: warning: loading in progress, circular require considered harmful - ~/uproject/utopia-project-code/main/source/server/service/pmu_service/user_service.rb
from main_service.rb:7:in `

'
from main_service.rb:7:in `require_relative'
from ~/uproject/utopia-project-code/main/source/server/service/pmu_service/user_service.rb:7:in `'
from ~/uproject/utopia-project-code/main/source/server/service/pmu_service/user_service.rb:7:in `require_relative'
from ~/uproject/utopia-project-code/main/source/server/service/pmu_service/user_handler.rb:6:in `'
from ~/uproject/utopia-project-code/main/source/server/service/pmu_service/user_handler.rb:6:in `require_relative'

所以强烈推荐使用 ruby -w 检查语法警告,在项目运行之前。

要强调的是:循环引用并不仅仅是警告,而会直接导致项目运行失败。

网友评论comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

暂无评论

Copyright © 2012-2017 YUNWEIPAI.COM - 运维派 - 粤ICP备14090526号-3
扫二维码
扫二维码
返回顶部