2016-05-03 18 views
7

Od czasu Ruby 2.0 możliwe stało się stałe prywatne używanie private_constant, co powodowało błąd, jeśli stała jest używana bezpośrednio poza modułem deklarowania.Powtórzenie tylko publicznych stałych Ruby

Jednak constants i const_defined? nadal zwracają prywatne stałe, a const_get pozwala na dostęp do nich. Czy istnieje sposób programowej identyfikacji stałych prywatnych i filtrowania ich w czasie wykonywania?

(Uwaga: What does Module.private_constant do? Is there a way to list only private constants? i jego odpowiedź nie konkretnie rozwiązać tę sprawę, ale raczej na odwrót (jak na liście tylko prywatne stałych).)


Aktualizacja: Wygląda to tak, jakby w Rubim 1.9 i 2.0, constants zawierały tylko publiczne stałe. Począwszy od 2.1, no-arg constants nadal zawiera tylko publiczne stałe, ale ustawienie inherit na false z constants(false) (tj. Lista wyłącznie stałych zdefiniowanych w tym module, a nie w swoich modułach przodków) ma efekt uboczny wystawiania prywatnych stałych.

+0

Możliwy duplikat http://stackoverflow.com/questions/12944616/what-does-module-private-constant-do-is-there-a -way-to-list-only-private-consta –

+0

Są one nadal zdefiniowane. Czy chcesz, żeby Ruby kłamała? – tadman

+1

Nie powielam twojego problemu w Ruby 2.1.4: '2.1.4: 001> moduł Foo; X = 1; Y = 2; private_constant: Y; koniec; Foo.constants' zwraca '[: X]' –

Odpowiedz

4

można zidentyfikować stałe przez następny sposób:

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 wydaje się wymagać tablicy stałych nie-prywatnych i mówi, że metoda 'constants' zwraca * wszystkie * stałe (chcą odfiltrować stałe prywatne). Zgadzam się jednak, że to działa, a także 'A.constants' zwraca' [: C2] 'zgodnie z oczekiwaniami - i to, co OP wydaje się chcieć - nie jest więc całkowicie pewne, jaki jest faktyczny problem PO. –

+0

@NeilSlater, odpowiedziałem w odpowiedzi 'Czy istnieje sposób programowej identyfikacji stałych prywatnych?' – Ilya

+0

Nowa edycja pokazuje wszystkie możliwe sposoby. Nie mogę się z tym kłócić :-) Zastanawiam się, dlaczego pytanie mówi, że to nie działa na OP? –