在不制动的情况下重载 Kernel.require()

Overloading Kernel.require() without braking it

我正在尝试重载 Kernel.require() 方法以获取构建代码依赖树所需的数据。这就是我简单想象的新 require 方法:

def require arg
  super arg
  puts "including '#{arg}' in '#{caller_locations(1).first.path}'"
end

不幸的是,我发现这会阻止代码中其他地方的 require() 调用,从而导致一系列错误。

Kernel#require returns truefalse 的原始实现。您的新 require 方法不再 return 该值,而是始终 returns nil(来自 p 方法的响应)。

我可以想象,在某些情况下,在代码中设置条件并根据 require 的响应定义常量是有意义的。

您可以通过交换方法中的行来解决问题:

def require(name)
  puts "requiring '#{name}' in '#{caller_locations(1).first.path}'"
  super
end