为什么Ruby的`require 'file'`无法工作,但`require './file'`可以呢?
尽管这是一个非常古老的帖子,但我认为额外的信息对初学者非常有用。
将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时,它会在这些目录中进行查找。
这里有一篇很好的信息性文章,你可以在这里获取更多关于require
、load
和require_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'起作用是有帮助的。
在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的加载路径中。要解决这个问题,我们可以手动将当前目录添加到加载路径中。
在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
方法来加载文件,它会直接在当前文件所在的目录中查找文件。