What's the difference between Kernel.require and Kernel.gem_original_require?

Yuri Kanivetsky <[email protected]> Fri, 25 Oct 2019 21:09:15 +0300
Newsgroups gmane.comp.lang.ruby.general
Message-ID <CAMhVC3aifaTddHgBb1RK-HvZjDWipEeER0zVm=Bu1vdog7ce4g@mail.gmail.com>
Hi,

Consider the following script:

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]

Do you know why Kernel is sometimes a class, sometimes a module? Why
do they have different receivers? Does receiver become self when
method gets called?

But more importantly, are Kernel.require and
Kernel.gem_original_require the same method? Is there any other place
where Kernel.require gets overridden? Thanks in advance.

Regards,
Yuri

Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk>