Начиная с Ruby 2.0 или около того, можно было сделать константу приватной, используя private_constant
, что приводит к ошибке, если константа используется непосредственно вне модуля объявления.
Однако constants
и const_defined?
по-прежнему возвращает частные константы, а const_get
разрешает доступ к ним. Есть ли способ программно определить частные константы и отфильтровать их во время выполнения?
(Примечание: Что делает Module.private_constant? Есть ли способ перечислить только частные константы? и его ответ не специально адресовать этот случай, а скорее наоборот (как перечислить только константы private).)
Обновление: похоже, что в Ruby 1.9 и 2.0 constants
включает только общедоступные константы. Начиная с 2.1, constants
без аргументов по-прежнему включает только общедоступные константы, но установка inherit
на false
с constants(false)
(т. е. список только констант, определенных в этом модуле, а не в его модулях-предках) имеет побочный эффект раскрытия частных констант.
2.1.4 :001 > module Foo; X = 1; Y = 2; private_constant :Y; end; Foo.constants
возвращает[:X]
- person Neil Slater   schedule 03.05.2016private_constant
, и кажется, что флаг добавляется непосредственно к константе (это не отдельный поиск), поэтому, если вы удаляете константу, вы неявно удаляете ее статус частного флага. - person Neil Slater   schedule 03.05.2016inherit
- см. правки. - person David Moles   schedule 03.05.2016