这两个要求语句在Ruby中是否相同?

时间:2017-02-24 17:55:52

标签: ruby

时:

require './test_req.rb'

与此相同:

require './test_req'

和这个

require_relative 'test_req.rb'
在Ruby中

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

1 个答案:

答案 0 :(得分:2)

  

时:

require './test_req.rb'
     

与此相同:

require './test_req'

没有。第一个将在当前工作目录中查找名为test_req.rb的文件。第二个将在当前工作目录中查找实现定义的文件集。 YARV会查找test_req.rbtest_req.rbwtest_req.sotest_req.dlltest_req.dylib。 JRuby将查找test_req.rbtest_req.rbwtest_req.sotest_req.dlltest_req.dylibtest_req.classtest_req.jar。 Rubinius将寻找test_req.rbtest_req.rbwtest_req.sotest_req.dlltest_req.dylibtest_req.rba。 (注意:此列表来自内存,我没有仔细检查它。)

请注意,这些都应该永远不会使用。当前工作目录不受脚本控制。在最好的情况下,这可能会导致一个脆弱的脚本,有时会失败LoadError,具体取决于脚本执行时当前工作目录的位置。但更糟糕的是:不仅当前工作目录不受脚本控制,它还在调用者的控制之下。这意味着调用者可以通过在他们控制的某个目录中提供自己的test_req.rb并在调用脚本之前将该目录设置为当前工作目录,将任意代码注入到脚本中。

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

  

和这个

require_relative 'test_req.rb'

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