在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
。答案 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