我在/ Projects / test中创建了一个包含以下文件的项目:
/Projects/test/first.rb
/Projects/test/second.rb
在first.rb
,我这样做:
load 'second.rb'
它正确加载。但是,如果我打开控制台并输入$:
,我在加载路径中看不到当前目录"."
。 Ruby如何知道从哪里加载'second.rb'
?
答案 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所做的实际检查基本上是“路径是以'/','〜'还是'./'?”开始。