由于Ruby 2.0左右,可以使用private_constant
创建一个常量私有,如果直接在声明模块之外使用常量,则会导致错误。
但是,constants
和const_defined?
仍会返回私有常量,const_get
允许访问它们。有没有办法以编程方式识别私有常量并在运行时过滤掉它们?
(注意:What does Module.private_constant do? Is there a way to list only private constants?及其答案并未专门针对此案例,而是相反(如何仅列出私有常量)。)
更新:看起来好像在Ruby 1.9和2.0中,constants
确实只包含公共常量。从2.1开始,no-arg constants
仍然只包含公共常量,但将inherit
设置为false
constants(false)
(即,仅列出此模块中定义的常量,而不是在它的祖先模块中)具有暴露私有常量的副作用。
答案 0 :(得分:4)
您可以通过下一种方式识别常数:
class A
C = "value"
private_constant :C
C2 = "value2"
end
A.constants #public constants
#=> [:C2]
A.constants(false) #public & private constants
#=> [:C, :C2]
A.constants(false) - A.constants #private constants
#=> [:C]