2016-05-03 2 views
7

Depuis Ruby 2.0, il est possible de créer une constante privée en utilisant private_constant, ce qui entraîne une erreur si la constante est utilisée directement en dehors du module de déclaration.Itérer uniquement les constantes Ruby publiques

Toutefois, constants et const_defined? renvoient toujours des constantes privées et const_get permet d'y accéder. Existe-t-il un moyen d'identifier par programme les constantes privées et de les filtrer lors de l'exécution?

(Note: What does Module.private_constant do? Is there a way to list only private constants? et sa réponse ne traitent pas de ce cas, mais plutôt l'inverse (comment lister seulement privées constantes).)


Mise à jour: Il semble que dans Ruby 1.9 et 2.0, constants n'incluait que des constantes publiques. A partir de 2.1, le sans-argument constants inclut toujours uniquement des constantes publiques, mais définir inherit à false avec constants(false) (c'est-à-dire, liste uniquement les constantes définies dans ce module, pas dans ses modules ancêtres) a pour effet secondaire d'exposer les constantes privées.

+0

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

+0

Ils sont toujours définis. Veux-tu que Ruby mente? – tadman

+1

Je ne suis pas en train de répliquer votre problème dans Ruby 2.1.4: '2.1.4: 001> module Foo; X = 1; Y = 2; private_constant: Y; fin; Foo.constants' renvoie '[: X]' –

Répondre

4

Vous pouvez identifier des constantes par côté:

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

OP semble vouloir un tableau de constantes non-privées, et dit que la méthode 'constants' renvoie * toutes * les constantes (elles veulent filtrer les constantes privées). Je suis d'accord cependant, que cela fonctionne, et aussi 'A.constants' renvoie' [: C2] 'comme prévu - et ce que OP semble vouloir - donc pas tout à fait sûr quel est le problème réel de l'OP. –

+0

@NeilSlater, j'ai répondu à la question 'Y at-il un moyen d'identifier par programme les constantes privées?' – Ilya

+0

Nouvelle édition montre toutes les manières possibles. Ne peut pas discuter avec cela :-) Je me demande pourquoi la question dit que cela ne fonctionne pas pour OP? –