Wie von Ruby 2.1, während Module#constants
nur öffentliche Konstanten enthält, wenn Sie inherit=false
gesetzt ist, wird man auch privat Konstanten erhalten. Wenn Sie also eine Konstante in constants(false)
finden, aber nicht in constants
(und Sie nicht über vererbte Konstanten Pflege), das könnte eine mehr oder weniger zuverlässige Art und Weise zu sagen, wenn es privat ist.
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]
Dies ist nicht dokumentiert, und ich bin nicht sicher, ob es Absicht ist, aber es funktioniert empirisch. Ich würde es mit Unit-Tests untermauern.
Update: Es sieht aus wie diese a bug in Ruby ist, und in einer zukünftigen Version verschwinden.
Bitte erklären Sie, welche Verwendung Sie planen, zu erhalten. –
Ruby hat keine privaten Konstanten. Der nächste, den Sie bekommen können, ist eine Klassenvariable, aber das ist nicht besonders privat, da es mit allen Unterklassen geteilt wird. – Linuxios
@RyanBigg Ich habe keine Verwendung dafür. Ich verstehe die Relevanz Ihrer Frage zu meiner Frage nicht. – sawa