仅迭代公共Ruby常量

时间:2016-05-03 19:00:48

标签: ruby private-members

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

但是,constantsconst_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)(即,仅列出此模块中定义的常量,而不是在它的祖先模块中)具有暴露私有常量的副作用。

1 个答案:

答案 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]