为什么加载“file.rb”即使“。”也可以工作。是不是在加载路径?

时间:2013-11-13 05:56:17

标签: ruby load-path

我在/ Projects / test中创建了一个包含以下文件的项目:

/Projects/test/first.rb
/Projects/test/second.rb

first.rb,我这样做:

load 'second.rb'

它正确加载。但是,如果我打开控制台并输入$:,我在加载路径中看不到当前目录"."。 Ruby如何知道从哪里加载'second.rb'

2 个答案:

答案 0 :(得分:1)

请清楚地查看Kernel#load的文档:

  

在文件filename中加载并执行Ruby程序。 如果文件名未解析为绝对路径 将在$:中列出的库目录中搜索该文件。如果可选的wrap参数为true,则加载的脚本将在匿名模块下执行,从而保护调用程序的全局名称空间。在任何情况下,加载文件中的任何局部变量都不会传播到加载环境。

如果load 'second.rb' - second.rb已在内部解析为绝对路径/Projects/test/second.rb,则目录中的需求文件与所需的文件目录相同。对于您的案例,没有搜索到$:中列出的目录。

永远记住另一种方式 - load方法首先在文件的当前目录中查找

答案 1 :(得分:1)

与当前接受的答案相反,参数'second.rb' 无法解析为绝对路径。如果这是意思,那么你也可以require 'second.rb',因为require对绝对路径的措辞完全相同。

我认为这里发生的事情只是load的文档中的措辞根本不清楚实际步骤是什么。当它说“在文件文件名中加载并执行Ruby程序”时,它意味着字面意思 - 它将参数视为文件名并尝试将其作为Ruby程序加载。如果不是绝对路径†,那么Ruby会通过$ LOAD_PATH并在那些地方查找它。如果那不会变成任何东西,那么它就会继续并试图在你传入它时打开它。这就是MRI实际遵循的逻辑。

†Ruby所做的实际检查基本上是“路径是以'/','〜'还是'./'?”开始。