考虑以下脚本:
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
吗?
但更重要的是,self
和Kernel.require
是相同的方法吗? Kernel.gem_original_require
gets overridden还有另一个地方吗?如果您能回答其余问题,那将是很棒的事情。
答案 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