是什么Module.private_constant办? 有没有办法只列出私人常数?(What

2019-09-24 05:42发布

在Ruby中1.9.3开始,我们可以创建私有常量:

module M
  class C; end
  private_constant :C
end

是否有什么这个没有一个良好的文档? 有没有办法让唯一的民营常量类似于调用名constants

Answer 1:

随着Ruby 2.1的,而Module#constants仅包括公共常量,如果设置inherit=false ,你会得到私人常数为好。 所以,如果你发现在恒定constants(false) ,但不是constants (和你不关心继承常数),这可能是一个或多或少可靠的方式来告诉我们,如果它是私有的。

class Module
  def private_constants
    constants(false) - constants
  end
end

module Foo
  X = 1
  Y = 2
  private_constant :Y
end

puts "Foo.constants = #{Foo.constants}"
puts "Foo.constants(false) = #{Foo.constants(false)}"
puts "Foo.private_constants = #{Foo.private_constants}"

# => Foo.constants = [:X]
# => Foo.constants(false) = [:X, :Y]
# => Foo.private_constants = [:Y]

这是无证,我不知道这是否是故意的,但经验很有效。 我将单元测试备份。


更新:它看起来这是在Ruby中的错误 ,并在未来的版本中可能会消失。



Answer 2:

有私人常数,直到红宝石1.9.3没有这样的事情。 为了让所有的常量列表,虽然,你可以简单地使用constants

module Mod
  CONST = "value"
end

Mod.constants #=> [:CONST]

从1.9.3, private_constant加入,但没有什么是真正的私有,你可以做...

module Mod
  CONST = "value"
  private_constant :CONST
end

Mod.const_get(:CONST) #=> "value"

我不认为这是获取所有私人常量列表的方式,但你仍然可以测试特定名称的存在。

Mod.const_defined?(:CONST) #=> true


文章来源: What does Module.private_constant do? Is there a way to list only private constants?