我已经看到两种常用的技术,用于将当前正在执行的文件的目录添加到$ LOAD_PATH(或$ :).如果你不使用宝石,我会看到这样做的好处.显然,一个看起来比另一个看起来更冗长,但有理由与其中一个相提并论吗?
第一个,冗长的方法(可能是过度杀伤):
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
Run Code Online (Sandbox Code Playgroud)
而且更直接,快速和肮脏:
$:.unshift File.dirname(__FILE__)
Run Code Online (Sandbox Code Playgroud)
有理由和其他人一起去吗?
我理解之间的细微差异require
,load
以及autoload
在Ruby中,但我的问题是,你怎么知道该用哪一个呢?
除了能够load
在匿名模块中"包装"a之外,require
似乎更受欢迎.
但是然后autoload
允许你懒惰加载文件 - 听起来很棒但我不确定你获得了什么require
一种方法比另一种方法更受欢迎吗?是否存在一种方法脱颖而出的情况?
在我的Ruby程序中,我试图懒惰加载一个库(好奇的破解).
如果我这样做:
require 'rubygems'
require 'crack'
Run Code Online (Sandbox Code Playgroud)
一切都很好.但是,当我尝试这个:
require 'rubygems'
autoload :Crack, 'crack'
Run Code Online (Sandbox Code Playgroud)
引发LoadError.(没有这样的文件加载 - 破解)
为什么会出现此错误?是因为'crack'(因此我的其他用户安装的宝石)不在我的$ LOAD_PATH中吗?
编辑:
此外,autoload
与标准库一起使用:
autoload :Yaml, 'yaml'
Run Code Online (Sandbox Code Playgroud)
工作正常,并没有错误.