2017-08-15 40 views
1

我的錢修補const_missing方法爲Object和差異背景:Const_missing勾手不解僱

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鉤子沒有解僱?

回答

0

你的例子不是最小的,也不運行。如果我嘗試以下操作,它沒有任何問題。我認爲你的問題與其他問題有關。

class Object 

    def self.inherited(base) 
    base.extend(Class_Methods) 
    super 
    end 

    def self.const_missing_impl(const, location) 
    puts "loading(in #{location}) %s" % const.to_s 
    path = const.to_s.split('::').compact.map(&:downcase).join('/') 
    puts "require #{path}" 
    end 

    def const_missing(const) 
    Object.const_missing_impl(const, 'Object') 
    end 

    class << self 
    def const_missing(const) 
     Object.const_missing_impl(const, 'Object class << self') 
    end 
    end 

    module Class_Methods 
    def const_missing(const) 
     Object.const_missing_impl(const, 'Class_Methods') 
    end 

    class << self 
     def const_missing(const) 
     Object.const_missing_impl(const, 'Class_Methods class << self') 
     end 
    end 
    end 

    extend Class_Methods 
end 

a = CONST1 
b = a::CONST2 
c = String::CONST3 
d = Class_Methods::CONST4 

# Prints 
loading(in Object class << self) CONST1 
require const1 
loading(in Object class << self) CONST2 
require const2 
loading(in Object class << self) CONST3 
require const3 
loading(in Class_Methods class << self) CONST4 
require const4