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.
Możliwy duplikat http://stackoverflow.com/questions/12944616/what-does-module-private-constant-do-is-there-a -way-to-list-only-private-consta –
Są one nadal zdefiniowane. Czy chcesz, żeby Ruby kłamała? – tadman
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]' –