可以`require`替换为`require_relative`吗?

时间:2013-09-02 09:32:42

标签: ruby require

鉴于存在require_relative,它接受​​相对路径和绝对路径,是否有任何理由特别使用require,它只接受绝对路径?是否可以将所有require替换为require_relative

修改

Sergio Tulentsev注意到我require_relative不能用于宝石。它为什么这么设计?如果require_relative仅仅是requirerequire的超集,会出现什么问题?或者,是因为require_relative出现的时间晚于将宝石纳入Ruby核心系统,而require_relative的作者没有对宝石系统周围的代码进行修改?

3 个答案:

答案 0 :(得分:6)

require 'json'

require也可用于要求来自宝石的代码,而require_relative则无法执行此操作。因此,后者不能替代前者。

RE:编辑

我认为您的其他问题的答案是:代码复杂性。 require具有搜索lib路径的额外功能。 require_relative替换基本路径等。统一同一功能中的所有功能可能会使其过于复杂。代码越复杂,出错的可能性就越大。这是我的猜测。

答案 1 :(得分:1)

  

所有要求都可以用require_relative替换吗?

:反之亦然:require_relativerequire的便捷子集:

require_relative('path')

等于:

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

如果定义了__FILE__,否则会引发LoadError

  

是否有任何理由特别使用require?

您只能使用require而不是require_relative执行以下操作:

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

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

    require_relative无法做到这一点,因为文档说道路搜索仅在“文件名无法解析为绝对路径”时发生(即以/./开头或者../),File.expand_path始终如此。


我已在https://stackoverflow.com/a/26565471/895245

详细解释了这一点

答案 2 :(得分:0)

Ruby具有-I标志,用于包含目录以进行require查找。因此,如果您push $:变量的文件夹(也就是ENV['PATH'])或在命令行使用Isome_lib,那么require可以是使用时未指定该文件的基本文件夹位置。

require_relative用于其他目的,即使用__FILE__目录位置来引用您想要require的文件的位置。所以它可以用于需要来自gem的文件,但这可能是更多的工作。意识到宝石可以“出售”并位于您的应用程序非常接近甚至包含的目录中。通常,安装的宝石会放在$PATH中以便于查找,因此通常不需要这样做。

要求使用require_relative的宝石是一种反模式,因为它可能需要作为Gemfile中的宝石,您可以在其中指定文件的来源并加载环境对于使用Bundler的应用程序,也许。