鉴于存在require_relative
,它接受相对路径和绝对路径,是否有任何理由特别使用require
,它只接受绝对路径?是否可以将所有require
替换为require_relative
?
修改
Sergio Tulentsev注意到我require_relative
不能用于宝石。它为什么这么设计?如果require_relative
仅仅是require
和require
的超集,会出现什么问题?或者,是因为require_relative
出现的时间晚于将宝石纳入Ruby核心系统,而require_relative
的作者没有对宝石系统周围的代码进行修改?
答案 0 :(得分:6)
require 'json'
require
也可用于要求来自宝石的代码,而require_relative
则无法执行此操作。因此,后者不能替代前者。
我认为您的其他问题的答案是:代码复杂性。 require
具有搜索lib路径的额外功能。 require_relative
替换基本路径等。统一同一功能中的所有功能可能会使其过于复杂。代码越复杂,出错的可能性就越大。这是我的猜测。
答案 1 :(得分:1)
所有要求都可以用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
始终如此。
答案 2 :(得分:0)
Ruby具有-I
标志,用于包含目录以进行require
查找。因此,如果您push
$:
变量的文件夹(也就是ENV['PATH']
)或在命令行使用Isome_lib
,那么require
可以是使用时未指定该文件的基本文件夹位置。
require_relative
用于其他目的,即使用__FILE__
目录位置来引用您想要require
的文件的位置。所以它可以用于需要来自gem的文件,但这可能是更多的工作。意识到宝石可以“出售”并位于您的应用程序非常接近甚至包含的目录中。通常,安装的宝石会放在$PATH
中以便于查找,因此通常不需要这样做。
要求使用require_relative
的宝石是一种反模式,因为它可能需要作为Gemfile
中的宝石,您可以在其中指定文件的来源并加载环境对于使用Bundler
的应用程序,也许。