在Ruby中,require_relative和require有什么区别?


当前回答

绝对路径

require './app/example_file.rb'

缩短的名字

require_relative 'example_file'

其他回答

总结

使用要求安装宝石

对于本地文件使用require_relative

require使用$LOAD_PATH查找文件。 Require_relative使用语句使用文件的当前位置


需要

Require依赖于你已经安装(例如gem install [package])一个包在你的系统的某个地方的功能。

当使用require时,你可以使用"。/"格式为当前目录下的文件,例如require "。/my_file”,但这不是一个常见的或建议的做法,你应该使用require_relative代替。

require_relative

这仅仅意味着包含“相对于require_relative语句的文件位置”的文件。我通常建议文件应该“在”当前目录树中,而不是“向上”,例如不要使用

require_relative '../../../filename'

(最多3个目录级别),因为这会产生不必要的、脆弱的依赖关系。然而,在某些情况下,如果你已经在目录树中“深入”,那么“上下”另一个目录树分支可能是必要的。也许更简单的是,不要对这个存储库之外的文件使用require_relative(假设你使用的是git,这在2018年底基本上是一个事实上的标准)。

注意,require_relative使用带有require_relative语句的文件的当前目录(所以不一定是您使用命令的当前目录)。这使require_relative路径保持“稳定”,因为它总是相对于以相同方式需要它的文件。

我刚刚看到RSpec的代码中有一些关于require_relative是O(1)常数和require是O(N)线性的注释。因此,可能区别在于require_relative比require更可取。

上面的答案是正确的,但技术性很强。对于刚接触Ruby的人:

Require_relative很可能用于从您编写的另一个文件引入代码。

例如,如果数据在~/my-project/data中。你想把它包含在~/my-project/solution。Rb ?在解决方案。Rb你会添加require_relative 'data'。

需要注意的是,这些文件不需要在同一个目录中。require_relative“. . / . ./folder1/folder2/data'也是有效的。

Require很可能用于从别人编写的库中引入代码。

例如,如果您想使用active_support库中提供的一个helper函数,该怎么办?你需要用gem install activesupport安装gem,然后在文件中要求'active_support'。

require 'active_support/all'
"FooBar".underscore

说不同,

Require_relative需要一个专门指向调用它的文件的文件。 require要求包含在$LOAD_PATH中的文件。

绝对路径

require './app/example_file.rb'

缩短的名字

require_relative 'example_file'

我想补充的是,当使用Windows时,你可以使用require './1。如果脚本在本地或映射的网络驱动器上运行,但如果从UNC \\servername\sharename\文件夹路径运行,则需要使用require_relative './1.rb'。

我不参与其他原因的讨论。