Poiché Ruby 2.0 o giù di lì, è stato possibile rendere un privato costante utilizzando private_constant
, causando un errore se la costante viene utilizzata direttamente all'esterno del modulo di dichiarazione.Iterate su solo costanti Ruby pubbliche
Tuttavia, constants
e const_defined?
restituiscono ancora costanti private e const_get
consente di accedervi. C'è un modo per identificare a livello di codice costanti private e filtrarle in fase di esecuzione?
(Nota: What does Module.private_constant do? Is there a way to list only private constants? e la sua risposta non affrontano specificamente questo caso, ma piuttosto il contrario (come elencare solo private costanti).)
Aggiornamento: Sembra come se in Ruby 1.9 e 2.0, constants
includeva solo costanti pubbliche. A partire da 2.1, il no-arg constants
include ancora solo le costanti pubbliche, ma l'impostazione di inherit
a false
con constants(false)
(ovvero, elenca solo le costanti definite in questo modulo, non nei suoi moduli antenati) ha l'effetto collaterale di esporre le costanti private.
Eventuali duplicati di http://stackoverflow.com/questions/12944616/what-does-module-private-constant-do-is-there-a -way-to-list-only-private-consta –
Sono ancora definiti. Vuoi che Ruby mentisca? – tadman
Non sto replicando il tuo problema in Ruby 2.1.4: '2.1.4: 001> modulo Foo; X = 1; Y = 2; private_constant: Y; fine; Foo.constants' restituisce '[: X]' –