Ruby: Module 的单例class 中重新定义const_missing 方法

Ruby: Redefining const_missing method in Module's singleton class

Module Singleton classconst_missing 方法的重新定义 class 似乎不起作用。但是如果我直接在 class Module 中重新定义它就可以了。有什么原因吗?

class Module
  class << self
    def const_missing(constant)
      puts "This doesn't work!"
    end
  end
end

Hello

下面的作品在哪里!

class Module
  def const_missing(constant)
    puts 'This works!'
  end
end

Hello

上下文:

为什么你认为在 Module 的 eigenclass 上定义 const_missing 不起作用?它完美地工作:

▶ class Module
▷   class << self  
▷     def const_missing(constant)    
▷       puts "This doesn't work!"      
▷     end      
▷   end    
▷ end  
#⇒ :const_missing
▶ Module::F
#⇒ This doesn't work!

问题是你想达到什么目的?当你的 Module/Class 被调用来调用它的常量时,你是否有兴趣处理案例:

module M ; end
puts M::MissingConst

你需要在 M 的特征 class 上实现 const_missing。哪个单例的 superclass 显然是 Module class 本身,而不是 Module 的 eigenclass (M.singleton_class.superclass => Module.)

如果你想虚拟地处理所有常量,这些常量由不带名称空间的标题名称引用,你可以使用:

class Object
  class << self
    def const_missing(name)
      puts 'bingo '
    end
  end
end

▶ F
#⇒ bingo