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

时间:2015-01-19 15:49:14

标签: ruby metaprogramming

const_missing类的Singleton class中重新定义Module方法似乎不起作用。但如果我直接在班级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

上下文

  • 在常量属于不被覆盖的类别的情况下,尝试使用super。假设与模式不匹配的常量仍然会导致NameError

1 个答案:

答案 0 :(得分:1)

为什么你认为在Module的本征类上定义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

您需要在const_missing的本征类上实施M。哪个单例的超类显然是Module类本身,而不是模块的本征类(M.singleton_class.superclass => Module。)

您是否想要处理由没有命名空间的titlaased名称引用的虚拟所有常量,您可以使用:

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

▶ F
#⇒ bingo