Inne języki OOP mają klasy wewnętrzne, których nie można utworzyć bez powiązania z klasą wyższego poziomu. Na przykład w Javie
class Car {
class Wheel { }
}
tylko metody w Carklasie mogą tworzyć Wheels.
Ruby nie ma takiego zachowania.
W Rubim
class Car
class Wheel
end
end
różni się od
class Car
end
class Wheel
end
tylko w nazwie klasy Wheelvs. Car::Wheel. Ta różnica w nazwie może wyraźnie wskazywać programistom, że Car::Wheelklasa może reprezentować tylko koło samochodowe, w przeciwieństwie do koła ogólnego. Zagnieżdżanie definicji klas w Rubim jest kwestią preferencji, ale służy celowi w tym sensie, że silniej wymusza kontrakt między dwiema klasami, a tym samym przekazuje więcej informacji o nich i ich zastosowaniach.
Ale dla interpretera Rubiego to tylko różnica w nazwie.
Jeśli chodzi o drugą obserwację, klasy zagnieżdżone w modułach są zwykle używane do określania przestrzeni nazw klas. Na przykład:
module ActiveRecord
class Base
end
end
różni się od
module ActionMailer
class Base
end
end
Chociaż nie jest to jedyne użycie klas zagnieżdżonych w modułach, jest na ogół najpowszechniejsze.
Car.newiCar::Wheel.new. Zdecydowanie nie musisz inicjowaćCarobiektu, aby zainicjowaćCar::Wheelobiekt w Rubim, aleCarklasa musi zostać załadowana i wykonana,Car::Wheelaby była użyteczna.