在Ruby中require_relative和require有什么区别?

kr98yfug  于 2023-06-29  发布在  Ruby
关注(0)|答案(9)|浏览(166)

Ruby中的require_relativerequire有什么区别?

64jmpszr

64jmpszr1#

看看docs
require_relative是对内置方法require的补充,它允许您加载与包含require_relative语句的文件相关的文件。
例如,如果你在“test”目录下有单元测试类,在test“test/data”目录下有它们的数据,那么你可以在测试用例中使用这样一行:

require_relative "data/customer_data_1"
x33g5p2x

x33g5p2x2#

require_relativerequire的方便子集

require_relative('path')

等于:

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

如果定义了__FILE__,则抛出LoadError
这意味着:

  • require_relative 'a'require_relative './a'需要相对于当前文件__FILE__)。

这是您在库中进行request时想要使用的,因为您不希望结果依赖于调用者的当前目录。

  • eval('require_relative("a.rb")')引发LoadError,因为__FILE__没有在eval中定义。

这就是为什么你不能在RSpec测试中使用require_relative,因为它会得到eval ed。
以下操作仅适用于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__
o75abkj4

o75abkj43#

摘要

安装gem使用require

本地文件使用require_relative

require使用您的**$LOAD_PATH**查找文件。
require_relative使用以下语句使用文件的当前位置

需要

Require依赖于您已安装(例如gem install [package])系统中某个位置的软件包来实现该功能。
当使用require时,您可以对当前目录中的文件使用“./”格式,例如:require "./my_file",但这不是常见或推荐的做法,您应该使用require_relative

require_relative

这仅仅意味着使用require_relative语句包含文件“相对于文件的位置”。我 * 一般 * 建议文件应该在当前目录树的“内部”,而不是“向上”,例如不要使用

require_relative '../../../filename'

(up 3个目录级别),因为这往往会创建不必要的和脆弱的依赖关系。然而,在某些情况下,如果你已经在一个目录树的“深处”,那么“向上和向下”另一个目录树分支可能是必要的。也许更简单的是,不要对这个存储库之外的文件使用require_relative(假设你使用的是git,这在2018年底的时候基本上是一个事实上的标准)。
请注意,require_relative使用require_relative* 语句的文件的当前目录 *(因此不一定是您正在使用命令的当前目录)。这使require_relative路径保持“稳定”,因为它总是以相同的方式相对于需要它的文件。

lyr7nygr

lyr7nygr4#

来自Ruby API

require_relative是对内置方法require的补充,它允许您加载与包含require_relative语句的文件相对的文件。
当您使用require加载文件时,您通常访问的是系统中已正确安装并可访问的功能。require并没有为在项目代码中加载文件提供一个很好的解决方案。在开发阶段,这对于访问测试数据,或者甚至对于访问“锁定”在项目内部的文件(不打算供外部使用)可能是有用的。
例如,如果你在“test”目录下有单元测试类,在test“test/data”目录下有它们的数据,那么你可以在测试用例中使用这样一行:

require_relative "data/customer_data_1"

因为“test”和“test/data”都不可能出现在Ruby的库路径中(这是有充分理由的),所以普通的require不会找到它们。require_relative是解决这个问题的好方法。
您可以包含或省略正在加载的文件的扩展名(.rb或.so)。
path必须响应to_str。
您可以在http://extensions.rubyforge.org/rdoc/classes/Kernel.html上找到文档

vwhgwdsa

vwhgwdsa5#

最重要的答案是正确的,但技术性很强。对于Ruby的新用户:

  • require_relative很可能用于从您编写的另一个文件中引入代码。

例如,如果您在~/my-project/data.rb中有数据,并且您想将其包含在~/my-project/solution.rb中,该怎么办?在solution.rb中,您将添加require_relative 'data'
重要的是要注意这些文件不需要在同一目录中。require_relative '../../folder1/folder2/data'也有效。

  • require很可能被用来从别人编写的库中引入代码。

例如,如果您想使用active_support库中提供的帮助函数之一,该怎么办?你需要用gem install activesupport安装gem,然后在require 'active_support'文件中安装。

require 'active_support/all'
"FooBar".underscore

换句话说

  • require_relative需要一个相对于调用它的文件而专门指向的文件。
  • require需要包含在$LOAD_PATH中的文件。
jjhzyzn0

jjhzyzn06#

我刚刚看到RSpec的代码有一些关于require_relative是O(1)常数和require是O(N)线性的注解。所以可能区别在于require_relativerequire更受欢迎。

zzzyeukh

zzzyeukh7#

我想补充的是,当使用Windows时,如果脚本在本地或Map的网络驱动器上运行,则可以使用require './1.rb',但当从UNC \\servername\sharename\folder路径运行时,您需要使用require_relative './1.rb'
我不参与讨论,因为其他原因。

3phpmpom

3phpmpom8#

在Ruby中,requirerequire_relative都用于将外部文件或库加载到Ruby程序中。但是,它们在如何定位和加载文件方面略有不同。

  1. require
  • require用于加载Ruby加载路径中的文件或作为gem安装的文件。
  • 它在$LOAD_PATH全局变量中列出的目录中搜索指定的文件。
  • 您需要从其中一个加载路径目录中提供文件的绝对或相对路径。
  • 示例:require 'my_file'
  1. require_relative
  • require_relative用于加载相对于当前文件目录的文件。
  • 它不会在Ruby加载路径或gems中进行搜索,而只是查找与当前文件相关的文件。
  • 您需要提供文件在当前文件目录中的相对路径。
  • 示例:require_relative 'subdirectory/my_file'
e5nqia27

e5nqia279#

绝对路径

require './app/example_file.rb'

简称

require_relative 'example_file'

相关问题