在Ruby中,require_relative和require有什么区别?
发布于 2010-09-08 23:09:12
只需看看文档:
require_relative通过允许加载相对于包含require_relative语句的文件的文件来补充内置方法require_relative。 例如,如果在" test“目录中有单元测试类,而在test " test / data”目录下有它们的数据,那么您可以在测试用例中使用如下一行: require_relative“数据/客户数据1”
发布于 2014-10-25 17:58:56
require_relative 是 require的一个方便的子集。
require_relative('path')相等:
require(File.expand_path('path', File.dirname(__FILE__)))如果定义了__FILE__,或者以其他方式引发LoadError。
这意味着:
require_relative 'a'和require_relative './a'要求相对于当前文件 (__FILE__)。
这是您需要在库中使用的内容,因为您不希望结果依赖于调用方的当前目录。eval('require_relative("a.rb")')会引发LoadError,因为__FILE__没有在eval中定义。
这就是为什么不能在require_relative测试中使用eval的原因。只有在require中才能进行下列操作
require './a.rb'要求相对于当前目录require 'a.rb'使用搜索路径($LOAD_PATH)来要求。它找不到相对于当前目录或路径的文件。
这在require_relative中是不可能的,因为文档说只有当“文件名不解析到绝对路径”(即从/、./或../开始)时才会进行路径搜索,这是File.expand_path的情况。使用这两种方法都可以执行以下操作,但是您希望使用require,因为它更短,效率更高:
require '/a.rb'和require_relative '/a.rb'都需要绝对路径。读取源
当文档不清楚时,我建议您查看源代码(切换文档中的源代码)。在某些情况下,它有助于理解正在发生的事情。
要求:
VALUE rb_f_require(VALUE obj, VALUE fname) {
return rb_require_safe(fname, rb_safe_level());
}require_relative:
VALUE rb_f_require_relative(VALUE obj, VALUE fname) {
VALUE base = rb_current_realfilepath();
if (NIL_P(base)) {
rb_loaderror("cannot infer basepath");
}
base = rb_file_dirname(base);
return rb_require_safe(rb_file_absolute_path(fname, base), rb_safe_level());
}这使得我们可以得出结论
require_relative('path')与以下相同:
require(File.expand_path('path', File.dirname(__FILE__)))因为:
rb_file_absolute_path =~ File.expand_path
rb_file_dirname1 =~ File.dirname
rb_current_realfilepath =~ __FILE__发布于 2015-04-25 13:06:25
摘要
使用require安装的gems
对本地文件使用require_relative
$LOAD_PATH使用require查找文件。
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语句(所以不一定是您的当前目录,因为您使用的是from命令)。这使得require_relative路径“稳定”,因为它总是相对于以相同方式要求它的文件。
https://stackoverflow.com/questions/3672586
复制相似问题