【发布时间】:2016-08-28 23:36:18
【问题描述】:
从 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? 及其答案并未专门针对这种情况,而是相反(如何仅列出 private 常量)。)
更新:看起来好像在 Ruby 1.9 和 2.0 中,constants 确实只包含公共常量。从 2.1 开始,无参数 constants 仍然只包含公共常量,但使用 constants(false) 将 inherit 设置为 false(即,仅列出此模块中定义的常量,而不是其祖先模块中定义的常量)有优势暴露私有常量的效果。
【问题讨论】:
-
它们仍然被定义。你想让鲁比撒谎吗?
-
我没有在 Ruby 2.1.4 中复制您的问题:
2.1.4 :001 > module Foo; X = 1; Y = 2; private_constant :Y; end; Foo.constants返回[:X] -
@tadman 不,我只是在记录我尝试过的内容。
-
@NeilSlater 这很有趣。当我尝试将其减少到最小的测试用例时,我也没有看到它。
标签: ruby private-members