1

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

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

first.rb中,我这样做:

load 'second.rb'

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

4

2 回答 2

1

Kernel#load请参阅清楚的文档:

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

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

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

于 2013-11-13T06:00:28.090 回答
1

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

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

† Ruby 所做的实际检查本质上是“路径是否以 '/'、'~' 或 './' 开头?”。

于 2013-11-13T07:11:35.693 回答