仅迭代公共Ruby常量

Dav*_*les 7 ruby private-members

由于Ruby 2.0左右,可以使用常量私有private_constant,如果常量直接在声明模块之外使用,则会导致错误.

然而,constantsconst_defined?仍返回私人常数,并const_get允许对它们的访问.有没有办法以编程方式识别私有常量并在运行时过滤掉它们?

(注意:Module.private_constant有什么作用?有没有办法只列出私有常量?它的答案并没有专门解决这种情况,而是相反(如何只列出私有常量).)


更新:看起来好像在Ruby 1.9和2.0中,constants确实只包含公共常量.从2.1开始,no-arg constants仍然只包含公共常量,但设置inheritfalsewith constants(false)(即,仅列出在此模块中定义的常量,而不是在其祖先模块中)具有暴露私有常量的副作用.

Ily*_*lya 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]
Run Code Online (Sandbox Code Playgroud)