【发布时间】:2017-08-15 13:45:43
【问题描述】:
我将 const_missing 方法修补到 Object 和不同的上下文中:
auto_loader.rb
%w{../../lib ../../app}.each do |path|
expanded_path = File.expand_path(path,__FILE__)
$LOAD_PATH.unshift(expanded_path) unless $LOAD_PATH.include?(expanded_path)
end
class Object
def self.inherited(base)
base.extend(Class_Methods)
super
end
def const_missing(const)
puts "loading(in Object) %s" % const.to_s
path = const.to_s.split('::').compact.map(&:downcase).join('/')
require path
self.const_get(const)
end
class << self
def const_missing(const)
puts "loading(in Object class << self) %s" % const.to_s
path = const.to_s.split('::').compact.map(&:downcase).join('/')
require path
self.const_get(const)
end
end
module Class_Methods
class << self
def const_missing(const)
puts "loading(in Class_Methods class << self) %s" % const.to_s
path = const.to_s.split('::').compact.map(&:downcase).join('/')
require path
self.const_get(const)
end
end
def const_missing(const)
puts "loading(in Class_Methods) %s" % const.to_s
path = const.to_s.split('::').compact.map(&:downcase).join('/')
require path
self.const_get(const)
end
end
extend Class_Methods
end
当我运行代码时,我看到:
NameError: Uninitialized constant CONST
没有显示任何puts。
我还加载代码:
pry -r ./lib/auto_loader.rb
结果是一样的。
另一方面,如果我手动触发const_missing 方法,我会看到loading(in Object) const。
为什么const_missing钩子没有被触发?
【问题讨论】: