首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ruby中,require_relative和require之间有什么区别?

在Ruby中,require_relative和require之间有什么区别?
EN

Stack Overflow用户
提问于 2010-09-08 23:05:51
回答 7查看 184.6K关注 0票数 326

在Ruby中,require_relativerequire有什么区别?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-09-08 23:09:12

只需看看文档

require_relative通过允许加载相对于包含require_relative语句的文件的文件来补充内置方法require_relative。 例如,如果在" test“目录中有单元测试类,而在test " test / data”目录下有它们的数据,那么您可以在测试用例中使用如下一行: require_relative“数据/客户数据1”

票数 317
EN

Stack Overflow用户

发布于 2014-10-25 17:58:56

require_relative require的一个方便的子集。

代码语言:javascript
运行
复制
require_relative('path')

相等:

代码语言:javascript
运行
复制
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'都需要绝对路径。

读取源

当文档不清楚时,我建议您查看源代码(切换文档中的源代码)。在某些情况下,它有助于理解正在发生的事情。

要求:

代码语言:javascript
运行
复制
VALUE rb_f_require(VALUE obj, VALUE fname) {
  return rb_require_safe(fname, rb_safe_level());
}

require_relative:

代码语言:javascript
运行
复制
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());
}

这使得我们可以得出结论

代码语言:javascript
运行
复制
require_relative('path')

与以下相同:

代码语言:javascript
运行
复制
require(File.expand_path('path', File.dirname(__FILE__)))

因为:

代码语言:javascript
运行
复制
rb_file_absolute_path   =~ File.expand_path
rb_file_dirname1        =~ File.dirname
rb_current_realfilepath =~ __FILE__
票数 111
EN

Stack Overflow用户

发布于 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语句包含文件“相对于文件的位置”。我通常建议文件应该“在”当前目录树中,而不是“向上”,例如不使用

代码语言:javascript
运行
复制
require_relative '../../../filename'

(增加3个目录级别)在文件系统中,因为这往往会产生不必要的、脆弱的依赖关系。但是,在某些情况下,如果您已经在目录树中“很深”,则可能需要“上下”另一个目录树分支。更简单地说,不对存储库之外的文件使用require_relative (假设您正在使用git,这在很大程度上是2018年末的一个事实标准)。

请注意,require_relative使用文件的当前目录和require_relative语句(所以不一定是您的当前目录,因为您使用的是from命令)。这使得require_relative路径“稳定”,因为它总是相对于以相同方式要求它的文件。

票数 81
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3672586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档