Altri linguaggi OOP hanno classi interne che non possono essere istanziate senza essere legate a una classe di livello superiore. Ad esempio, in Java,
class Car {
class Wheel { }
}
solo i metodi nella Car
classe possono creare Wheel
s.
Ruby non ha questo comportamento.
In Ruby,
class Car
class Wheel
end
end
si differenzia da
class Car
end
class Wheel
end
solo in nome della classe Wheel
contro Car::Wheel
. Questa differenza di nome può rendere esplicito ai programmatori che la Car::Wheel
classe può rappresentare solo una ruota di automobile, al contrario di una ruota generale. La nidificazione delle definizioni delle classi in Ruby è una questione di preferenza, ma ha uno scopo nel senso che impone più fortemente un contratto tra le due classi e nel farlo trasmette più informazioni su di loro e sui loro usi.
Ma per l'interprete Ruby, c'è solo una differenza nel nome.
Per quanto riguarda la tua seconda osservazione, le classi nidificate all'interno dei moduli vengono generalmente utilizzate per lo spazio dei nomi delle classi. Per esempio:
module ActiveRecord
class Base
end
end
si differenzia da
module ActionMailer
class Base
end
end
Sebbene questo non sia l'unico uso delle classi nidificate all'interno dei moduli, è generalmente il più comune.
Car.new
eCar::Wheel.new
. Sicuramente non è necessario inizializzare unCar
oggetto per inizializzare unCar::Wheel
oggetto in Ruby, ma laCar
classe deve essere caricata ed eseguita perCar::Wheel
essere utilizzabile.