Я плохо знаком с Ruby (опытный с Python, C++ и C). Я должен создать класс, который является только, чтобы использоваться другими классами и методами в модуле. В Python я просто назвал бы его __ имя класса. Я использовал бы пустое определение типа в C++. Как я делаю это в Ruby (или я рявкаю неправильное дерево и не делаю это "Ruby путь"?)
Я пока не встречал такой концепции в Ruby, но, думаю, вы можете имитировать это, создав приватный метод, который будет возвращать класс, созданный как локальная переменная (помните, что в Ruby класс - это такой же объект, как и любой другой, и может быть инстанцирован в методе и возвращен им).
BTW, даже приватные методы в Ruby не такие приватные, как в других языках - вы всегда можете получить к ним доступ, используя метод send
. Но это подразумевает, что вы знаете, что делаете.
Самое важное, что нужно понимать, - это то, что в классе нет ничего особенного. Это просто объект. Согласно соглашению, классы назначаются константам, но ничто не говорит о том, что они должны быть .
А поскольку классы - это просто объекты, как и любой другой объект, вы делаете их частными так же, как и любой другой объект.
Вот возможности, которые я могу придумать, в порядке увеличения приватности:
my_awesome_library
→ MyAwesomeLibrary
), но в целом все который вложен ниже этого пространства имен, считается закрытым. Фактически, помимо Test :: Unit :: TestCase
, я не могу придумать ни одного примера трехуровневого глубокого пространства имен, которое, как ожидается, действительно будет использоваться клиентским кодом. MyAwesomeLibrary :: Internal :: FfiStruct
: nodoc:
Тег RDoc. snake_case
- это всего лишь соглашение.) send
, похоже, более широко используется, чем instance_variable_get
, поэтому я считаю, что переменные экземпляра имеют более высокий уровень конфиденциальности, чем методы. Module.new
, Class.new
или Module # define_method
. Пример:
module MyAwesomeLibrary
struct = Class.new(FFI::Struct) do
# ...
end
PublicInterface = Class.new do
define_method(:initialize) do |bar|
@foo = struct.new(bar)
end
end
end
И да, это единственный способ достижения истинного 100% сокрытия и инкапсуляции информации в Ruby.
Однако нормальный способ Ruby - просто задокументировать материал как частный (возможно, опустить его на уровень пространства имен) и доверять другим разработчикам. В сообществе Ruby это иногда обобщается под лозунгом Python «Мы все взрослые по взаимному согласию».