3

鉴于存在require_relative接受相对路径和绝对路径的情况,是否有任何理由特别使用require仅接受绝对路径的情况?都require可以换require_relative吗?

编辑

Sergio Tulentsev 注意到我require_relative不能用于宝石。为什么会这样设计?require_relative如果仅仅是一个超集require并被require弃用,会出现什么问题?或者,只是因为require_relativegems 并入 Ruby 核心系统之后才出现,并且作者require_relative没有对 gems 系统周围的代码进行修改?

4

3 回答 3

6
require 'json'

require也可用于要求 gems 中的代码,require_relative但不能这样做。因此,后者不能替代前者。

回复:编辑

我认为您的附加问题的答案是:代码复杂性。require具有搜索库路径的额外权力。require_relative替换基本路径等。将同一功能中的所有功能统一起来可能会使它过于复杂。代码越复杂,就越有可能出现错误。这是我的猜测。

于 2013-09-02T09:37:16.290 回答
1

所有的require都可以用require_relative代替吗?

:它是相反的方式:require_relative是一个方便的子集require

require_relative('path')

等于:

require(File.expand_path('path', File.dirname(__FILE__)))

if__FILE__被定义,否则它会引发LoadError

有什么理由特别使用require吗?

您只能使用requireand not执行以下操作require_relative

  • 需要相对于当前目录(不是当前文件):require './a.rb'

  • 使用搜索路径 ( $LOAD_PATH) 要求:require 'a.rb'

    这是不可能的,require_relative因为文档说路径搜索仅在“文件名不解析为绝对路径”(即以/or./或开头../)时发生,对于File.expand_path.


我已在以下位置更详细地解释了这一点:https ://stackoverflow.com/a/26565471/895245

于 2014-11-22T08:26:53.693 回答
0

Ruby 具有包含用于查找-I目的的目录的标志。require因此,如果您push将文件夹指向$:变量(即ENV['PATH'])或Isome_lib在命令行中使用,则require可以在不指定该文件的基本文件夹位置的情况下使用。

require_relative用于不同的目的,即使用__FILE__目录位置来引用您想要的文件的位置require。所以它可以用来从 gem 中请求文件,但这样做可能需要更多的工作。意识到 gems 可以被“供应”并位于一个非常接近甚至包含在您的应用程序中的目录中。通常,为了便于查找,已安装的 gem 会被放入$PATH,因此通常不需要。

但是,要求 gems usingrequire_relative是一种反模式,因为它可能需要作为 gem 在您的Gemfile其中指定文件的源,并且可能会使用 为应用程序加载环境Bundler

于 2013-09-02T18:00:54.287 回答