为什么Ruby的`require 'file'`无法工作,但`require './file'`可以呢?

13 浏览
0 Comments

为什么Ruby的`require 'file'`无法工作,但`require './file'`可以呢?

我有一个包含许多Ruby文件的文件夹。当我尝试在同一目录中的一个文件中使用require 'file'来引用另一个文件时,会出现LoadError的错误。但是当我使用require './file'时,一切都正常工作。有人能解释一下为什么会出现这种情况吗?是否有任何方法可以在不添加./到文件的情况下引用文件?(目录图片):

alt text

0
0 Comments

尽管这是一个非常古老的帖子,但我认为额外的信息对初学者非常有用。

将require类比于UNIX的$PATH变量是最好的方式。简单回顾一下,UNIX中的$PATH变量是一个可执行文件所在目录的列表。因此,当你在任何UNIX终端输入程序名称时,计算机会在$PATH变量指定的目录中查找可执行文件。require做的事情非常类似。例如,当你在Ruby文件的顶部写下require 'set'时,你告诉Ruby在一系列目录中查找名为set.rb的库(Ruby的set库)。

那么Ruby在哪里查找set.rb呢?嗯,再一次,Ruby有一个非常类似于UNIX的$PATH变量。它是全局变量$LOAD_PATH,有时也被称为它丑陋且不描述的别名$:(我不建议使用这个别名,尽管它很短)。它是一个目录名称的数组,当Ruby遇到require时,它会在这些目录中进行查找。

这里有一篇很好的信息性文章,你可以在这里获取更多关于requireloadrequire_relative的信息。

Ruby require 'file' doesn't work but require './file' does. Why?

问题的出现原因是在使用require时,Ruby会在$LOAD_PATH中查找指定的文件。如果使用require 'file',Ruby只会在$LOAD_PATH中查找文件,而不会在当前目录下查找。但是,如果使用require './file',Ruby会先在当前目录下查找文件,如果找不到再去$LOAD_PATH中查找。因此,如果文件在当前目录下,使用require './file'可以正常工作,而使用require 'file'则无法找到文件。

解决方法是在$LOAD_PATH中添加当前目录。可以通过以下方式实现:

$LOAD_PATH.unshift('.')

这样,Ruby就会在当前目录下查找文件,而不仅仅是在$LOAD_PATH中查找。

希望这篇文章对你理解为什么require 'file'不起作用,而require './file'起作用是有帮助的。

0
0 Comments

在Ruby中,使用require关键字可以加载其他文件或库。通常情况下,我们可以使用require 'file'来加载一个文件,其中'file'是要加载的文件的名称。

然而,在某些情况下,当我们尝试使用require 'file'加载一个文件时,可能会出现加载失败的情况。相反,使用require './file'却可以正常加载。

出现这种情况的原因是因为在Ruby中,加载文件时,Ruby会查找文件的路径。而默认情况下,当前目录并不在Ruby的加载路径中。

为了解决这个问题,我们可以检查$LOAD_PATH变量的内容。这个变量包含了Ruby的加载路径。

可以通过以下代码来查看$LOAD_PATH变量的内容:

puts $LOAD_PATH

这段代码将会输出一个数组,其中包含了Ruby的加载路径。

如果我们发现当前目录并不在加载路径中,我们可以手动将当前目录添加到加载路径中。可以使用以下代码将当前目录添加到加载路径中:

$LOAD_PATH.unshift('.')

这段代码将会将当前目录添加到加载路径的最前面。

这样,当我们使用require 'file'时,Ruby会在加载路径的第一个位置查找文件,从而成功加载文件。

当我们在Ruby中使用require 'file'加载文件时失败,但require './file'却能成功加载时,原因是当前目录不在Ruby的加载路径中。要解决这个问题,我们可以手动将当前目录添加到加载路径中。

0
0 Comments

在Ruby中,使用require来加载一个文件。当你想要require一个文件时,如果这个文件不在系统$LOAD_PATH中,而是相对于你正在require的文件所在的目录,你应该使用require_relative。它并没有被广泛地记录在文档中。

那么为什么使用require 'file'无法工作,而使用require './file'可以呢?原因是require方法在搜索文件时,首先会查找系统中已经加载的文件,然后再搜索$LOAD_PATH中的路径。而require_relative方法则是相对于当前文件所在的目录进行搜索。

所以,当你使用require 'file'时,Ruby会先在系统中查找已加载的文件,如果没有找到,然后会在$LOAD_PATH中查找。而require_relative方法则直接在当前文件所在的目录中查找。

解决这个问题的方法就是使用require_relative方法来加载文件。这样,无论文件是否在$LOAD_PATH中,Ruby都可以正确地找到文件并加载它。

总结起来,使用require 'file'无法找到文件的原因是它只搜索系统中已加载的文件和$LOAD_PATH中的路径,而不会在当前文件所在的目录中查找。解决这个问题的方法是使用require_relative方法来加载文件,它会直接在当前文件所在的目录中查找文件。

0