Ruby защищенные константы или аналогичная реализация - PullRequest
0 голосов
/ 21 января 2020

Я хотел бы реализовать следующее:

module A
  class B
  end
  # can call A:B within module
end

# cannot call A:B outside of module (like private constant)

Я в основном хочу частные константы, но я хотел бы иметь возможность вызывать их с пространством имен в модуле.

Кажется, мне нужно какое-то защищенное поведение на константе B внутри A, но, насколько я знаю, Ruby не имеет защищенных констант.

Мне очень хотелось бы услышать идеи о том, как это можно реализовать .

1 Ответ

1 голос
/ 21 января 2020

Это можно сделать, но я понятия не имею, почему вы хотите это сделать.

module A
  class B
    def greeting
      puts "hi within #{self}"
    end
  end
  puts "constants within A = #{constants}"
  B.new.greeting
  # <more code>
  # lastly...
  const_set(:B, nil)
end

отображает:

constants within A = [:B]
hi within #<A::B:0x00005b2a18ffc538>
warning: already initialized constant A::B
warning: previous definition of B was here

Затем,

A::B.new.greeting
  NoMethodError (undefined method `new' for nil:NilClass)

При желании вы можете добавить '-W' или -W0 в командную строку для подавления предупреждающих сообщений.

Я понимаю, что ActiveSupport имеет метод Object :: remove_constant , позволяющий один для замены const_set(:B, nil) (или const_set("B", nil)) на:

Object.public_send(:remove_const, :B)

, что может быть предпочтительным.

...