Kernel.require和Kernel.gem_original_require有什么区别?

时间:2019-10-23 17:56:39

标签: ruby rubygems require

考虑以下脚本:

interface type1 {
    arg1: Array<string>,
    arg2: Array<string>
}

interface type2 {
    arg1: Array<number>,
    arg2: Array<number>
}

var t = function Test(arg: type1 | type2) {
    alert(arg.arg1);
    alert(arg.arg2);
}

var arg = { arg1: [2], arg2: [1]};
t(arg);

我对输出有很多疑问。为什么module Kernel unless defined?(gem_original_require_2) alias gem_original_require_2 require private :gem_original_require_2 end def require(path) return gem_original_require_2(path) end end p method(:require) # #<Method: main.require> p method(:require).owner # Kernel p method(:require).receiver # main p method(:require).source_location # ["1.rb", 7] puts '-' * 10 p Kernel.method(:require) # #<Method: Kernel.require> p Kernel.method(:require).owner # #<Class:Kernel> p Kernel.method(:require).receiver # Kernel p Kernel.method(:require).source_location # nil puts '-' * 10 p Kernel.method(:gem_original_require) # #<Method: Kernel.gem_original_require(require)> p Kernel.method(:gem_original_require).owner # Kernel p Kernel.method(:gem_original_require).receiver # Kernel p Kernel.method(:gem_original_require).source_location # nil puts '-' * 10 p Kernel.method(:gem_original_require_2) # #<Method: Kernel.gem_original_require_2(require)> p Kernel.method(:gem_original_require_2).owner # Kernel p Kernel.method(:gem_original_require_2).receiver # Kernel p Kernel.method(:gem_original_require_2).source_location # ["/home/yuri/.rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb", 34] 有时是类,有时是模块?为什么它们有不同的接收器?调用方法时,Kernel会变成receiver吗?

但更重要的是,selfKernel.require是相同的方法吗? Kernel.gem_original_require gets overridden还有另一个地方吗?如果您能回答其余问题,那将是很棒的事情。

1 个答案:

答案 0 :(得分:1)

我想您会在这里找到答案的一部分:https://stackoverflow.com/a/57236134/6008847

Rubygems代码替换了随附的require版本。

调用Kernel.require时,将获得原始的require方法。

当您校准require时,您将从Rubygems中获得方法(接收者将是您调用require的上下文)。

gem_original_require是原始require方法的别名:https://github.com/ruby/ruby/blob/v2_6_3/lib/rubygems/core_ext/kernel_require.rb#L16