2016-05-03 24 views
7

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.

+0

Eventuali duplicati di http://stackoverflow.com/questions/12944616/what-does-module-private-constant-do-is-there-a -way-to-list-only-private-consta –

+0

Sono ancora definiti. Vuoi che Ruby mentisca? – tadman

+1

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]' –

risposta

4

È possibile identificare le costanti entro il prossimo modo:

class A 
    C = "value" 
    private_constant :C 
    C2 = "value2" 
end 

A.constants #public constants 
#=> [:C2] 
A.constants(false) #public & private constants 
#=> [:C, :C2] 
A.constants(false) - A.constants #private constants 
#=> [:C] 
+0

L'OP sembra voler la matrice di costanti non private e sta dicendo che il metodo 'constants' restituisce * tutte * le costanti (vogliono filtrare le costanti private). Sono d'accordo, tuttavia, che questo funziona, e anche 'A.constants' restituisce' [: C2] 'come previsto - e quale OP sembra volere - quindi non del tutto sicuro di quale sia l'effettivo problema dell'OP. –

+0

@NeilSlater, ho risposto sulla risposta 'C'è un modo per identificare le costanti private in modo programmatico?' – Ilya

+0

La nuova modifica mostra tutti i modi possibili. Non posso discutere con questo :-) Mi chiedo perché la domanda dice che questo non funziona per OP? –