Ruby: Module 的单例class 中重新定义const_missing 方法
Ruby: Redefining const_missing method in Module's singleton class
Module
Singleton class
中 const_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
上下文:
- 尝试在常量属于不可覆盖的类别的情况下使用
super
。假设不匹配模式的常量仍应导致 NameError
.
为什么你认为在 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
Module
Singleton class
中 const_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
上下文:
- 尝试在常量属于不可覆盖的类别的情况下使用
super
。假设不匹配模式的常量仍应导致NameError
.
为什么你认为在 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