在Ruby中1.9.3开始,我们可以创建私有常量:
module M
class C; end
private_constant :C
end
是否有什么这个没有一个良好的文档? 有没有办法让唯一的民营常量类似于调用名constants
在Ruby中1.9.3开始,我们可以创建私有常量:
module M
class C; end
private_constant :C
end
是否有什么这个没有一个良好的文档? 有没有办法让唯一的民营常量类似于调用名constants
随着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中的错误 ,并在未来的版本中可能会消失。
有私人常数,直到红宝石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