为了账号安全,请及时绑定邮箱和手机立即绑定

在Ruby中,Required_Relative和Required之间有什么区别?

在Ruby中,Required_Relative和Required之间有什么区别?

GCT1015 2019-07-05 13:15:00
在Ruby中,Required_Relative和Required之间有什么区别?.之间的区别是什么?require_relative和require在鲁比?
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

只要看看博士:

require_relative补充内建法require通过允许加载相对于包含require_relative声明。

例如,如果在“test”目录中有单元测试类,而在test“test/data”目录下有它们的数据,那么您可以在测试用例中使用如下一行:

require_relative "data/customer_data_1"


查看完整回答
反对 回复 2019-07-05
?
jeck猫

TA贡献1909条经验 获得超7个赞

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在RSpec测试中,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());}

要求亲属:

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__


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 695 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信