【问题标题】:Can `require` be replaced by `require_relative`?`require` 可以替换为 `require_relative` 吗?
【发布时间】:2013-09-05 08:47:52
【问题描述】:

鉴于require_relative 接受相对路径和绝对路径,是否有任何理由特别使用只接受绝对路径的require? require可以全部换成require_relative吗?

编辑

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

【问题讨论】:

标签: ruby require


【解决方案1】:
require 'json'

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

回复:编辑

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      否:反之亦然:require_relative 是require 的一个方便子集:

      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做了更详细的解释

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-26
        • 2020-01-23
        • 1970-01-01
        • 2017-01-17
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多