我在 /Projects/test 中创建了一个项目,其中包含以下文件:
/Projects/test/first.rb
/Projects/test/second.rb
在first.rb
中,我这样做:
load 'second.rb'
它被正确加载。但是,如果我打开控制台并键入$:
,则在加载路径中看不到当前目录"."
。Ruby 怎么知道'second.rb'
从哪里加载它?
Kernel#load
请参阅清楚的文档:
加载并执行文件 filename 中的 Ruby 程序。如果文件名不解析为绝对路径,则在 $: 中列出的库目录中搜索该文件。如果可选的 wrap 参数为 true,则加载的脚本将在匿名模块下执行,保护调用程序的全局命名空间。在任何情况下,加载文件中的任何局部变量都不会传播到加载环境。
如果load 'second.rb'
-second.rb
已在内部解析为绝对路径/Projects/test/second.rb
,因为目录中的所需文件与所需文件目录相同。没有在$:
您的案例中列出的目录中搜索任何内容。
永远记住另一种方式 - load 方法首先在当前目录中查找文件
与当前接受的答案相反,该参数'second.rb'
不解析为绝对路径。如果这就是意思,那么您也可以require 'second.rb'
,因为require
关于绝对路径的措辞完全相同。
我认为这里发生的只是文档中的措辞load
根本不清楚实际步骤是什么。当它说“在文件文件名中加载并执行 Ruby 程序”时,它的字面意思是——它将参数视为文件名并尝试将其作为 Ruby 程序加载。如果不是绝对路径†,那么 Ruby 会通过 $LOAD_PATH 并在那些地方寻找它。如果这没有任何结果,那么它就会继续并尝试在你传入它时打开它。这就是 MRI 实际遵循的逻辑。
† Ruby 所做的实际检查本质上是“路径是否以 '/'、'~' 或 './' 开头?”。