2017-02-24 55 views
-1

是:这两个语句在Ruby中是否需要相同的语句?

require './test_req.rb' 

相同这一点:

require './test_req' 

require_relative 'test_req.rb' 
在Ruby中

?我一直在研究这三者之间的差异,并且似乎无法找到任何功能明智的。

+0

我没有看到前两个语句之间的任何区别。他们看起来一样 –

+0

@RichardHamilton对不起,我从第二个例子中删除了扩展名,这是一个错字。 – anemaria20

+4

Can.You不能用一些简单的测试自己回答这个问题吗? –

回答

2

是:

require './test_req.rb' 

相同这一点:

require './test_req' 

号第一个将查找名为在当前工作目录test_req.rb文件。第二个将在当前工作目录中查找实现定义的一组文件。 YARV将查找test_req.rb,test_req.rbw,test_req.so,test_req.dlltest_req.dylib。 JRuby将查找test_req.rb,test_req.rbw,test_req.so,test_req.dll,test_req.dylib,test_req.classtest_req.jar。 Rubinius将查找test_req.rb,test_req.rbw,test_req.so,test_req.dll,test_req.dylibtest_req.rba。 (注意:这个清单是从内存中,我没有仔细检查它。)

请注意,这两个应该从来没有被使用。当前工作目录不在脚本的控制范围之内。在最好的情况下,这可能会导致一个脆弱的脚本,它有时会根据当前工作目录在执行脚本时发生的任何错误而失败。但更糟糕的是,不仅当前工作目录不在脚本控制范围内,而是在调用者的控制之下。这意味着调用者可以通过在其控制下的某个目录中提供自己的test_req.rb,并在调用脚本之前将该目录设置为当前工作目录,从而将任意代码注入脚本。

这就是为什么.从Ruby 1.9中的$LOAD_PATH中删除,这就是为什么你永远不应该使用它。

require_relative 'test_req.rb' 

这是不等同于任何其它两个的。这将在与当前正在执行的文件相同的目录中查找名为test_req.rb的文件,而不是当前的工作目录。