Dav*_*les 7 ruby private-members
由于Ruby 2.0左右,可以使用常量私有private_constant,如果常量直接在声明模块之外使用,则会导致错误.
然而,constants和const_defined?仍返回私人常数,并const_get允许对它们的访问.有没有办法以编程方式识别私有常量并在运行时过滤掉它们?
(注意:Module.private_constant有什么作用?有没有办法只列出私有常量?它的答案并没有专门解决这种情况,而是相反(如何只列出私有常量).)
更新:看起来好像在Ruby 1.9和2.0中,constants确实只包含公共常量.从2.1开始,no-arg constants仍然只包含公共常量,但设置inherit为falsewith constants(false)(即,仅列出在此模块中定义的常量,而不是在其祖先模块中)具有暴露私有常量的副作用.
您可以通过以下方式识别常量:
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]
Run Code Online (Sandbox Code Playgroud)