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 Car
klasie mogą tworzyć Wheel
s.
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 Wheel
vs. Car::Wheel
. Ta różnica w nazwie może wyraźnie wskazywać programistom, że Car::Wheel
klasa 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.new
iCar::Wheel.new
. Zdecydowanie nie musisz inicjowaćCar
obiektu, aby zainicjowaćCar::Wheel
obiekt w Rubim, aleCar
klasa musi zostać załadowana i wykonana,Car::Wheel
aby była użyteczna.