У Ruby визначення вкладеного класу аналогічно визначенню класу в модулі. Він насправді не примушує асоціації між класами, він просто створює простір імен для констант. (Назви класів і модулів - константи.)
Прийнята відповідь ні про що не була правильною. 1 У наведеному нижче прикладі я створюю екземпляр лексично закритого класу без екземпляра класу, що додається, коли-небудь існував.
class A; class B; end; end
A::B.new
Переваги такі ж, як і для модулів: інкапсуляція, групування коду, що використовується лише в одному місці, та розміщення коду ближче до місця, де він використовується. Великий проект може мати один зовнішній модуль, який виникає знову і знову у кожному вихідному файлі і містить безліч визначень класів. Коли всі рамки та коди бібліотеки все це роблять, вони вносять лише одне ім'я до кожного найвищого рівня, зменшуючи ймовірність конфліктів. Безумовно, прозаїчно, але саме тому вони використовуються.
Використання класу замість модуля для визначення зовнішнього простору імен може мати сенс в однофайловій програмі або скрипті, або якщо ви вже використовуєте клас верхнього рівня для чогось, або якщо ви дійсно збираєтеся додати код для з'єднання класів разом у справжньому внутрішньому класі . У Ruby немає внутрішніх класів, але ніщо не заважає вам створювати приблизно однакову поведінку в коді. Посилання на зовнішні об’єкти із внутрішніх все ще потребуватимуть крапки з екземпляра зовнішнього об’єкта, але вкладення класів підкаже, що саме цим ви можете займатися. Ретельно модульована програма завжди може спочатку створювати класи, що додаються, і вони можуть бути розумно розкладені з вкладеними або внутрішніми класами. Ви не можете зателефонувати new
на модуль.
Ви можете використовувати загальну схему навіть для сценаріїв, де простір імен не дуже потрібен, просто для розваги та практики ...
#!/usr/bin/env ruby
class A
class Realwork_A
...
end
class Realwork_B
...
end
def run
...
end
self
end.new.run
Car.new
іCar::Wheel.new
. Вам точно не потрібно ініціалізуватиCar
об'єкт для ініціалізаціїCar::Wheel
об'єкта в Ruby, алеCar
клас повинен бути завантажений і виконаний,Car::Wheel
щоб бути корисним.