时:
require './test_req.rb'
与此相同:
require './test_req'
和这个
require_relative 'test_req.rb'
在Ruby中?我一直在研究这三者之间的区别,并且似乎无法找到任何功能。
答案 0 :(得分:2)
时:
require './test_req.rb'
与此相同:
require './test_req'
没有。第一个将在当前工作目录中查找名为test_req.rb
的文件。第二个将在当前工作目录中查找实现定义的文件集。 YARV会查找test_req.rb
,test_req.rbw
,test_req.so
,test_req.dll
和test_req.dylib
。 JRuby将查找test_req.rb
,test_req.rbw
,test_req.so
,test_req.dll
,test_req.dylib
,test_req.class
和test_req.jar
。 Rubinius将寻找test_req.rb
,test_req.rbw
,test_req.so
,test_req.dll
,test_req.dylib
和test_req.rba
。 (注意:此列表来自内存,我没有仔细检查它。)
请注意,这些都应该永远不会使用。当前工作目录不受脚本控制。在最好的情况下,这可能会导致一个脆弱的脚本,有时会失败LoadError
,具体取决于脚本执行时当前工作目录的位置。但更糟糕的是:不仅当前工作目录不受脚本控制,它还在调用者的控制之下。这意味着调用者可以通过在他们控制的某个目录中提供自己的test_req.rb
并在调用脚本之前将该目录设置为当前工作目录,将任意代码注入到脚本中。
这就是为什么.
从Ruby 1.9中的$LOAD_PATH
中删除的原因,以及为什么你永远不应该使用它。
和这个
require_relative 'test_req.rb'
这不等于其他两个中的任何一个。这将在当前正在执行的文件所在的目录中查找名为test_req.rb
的文件,而不是当前工作目录。