Ruby'de, iç içe bir sınıf tanımlamak, bir modülde bir sınıf tanımlamaya benzer. Aslında sınıflar arasındaki bir ilişkiyi zorlamaz, sadece sabitler için bir ad alanı oluşturur. (Sınıf ve Modül adları sabittir.)
Kabul edilen cevap hiçbir şey için doğru değildi. 1 Aşağıdaki örnekte, çevrelenen sınıfın bir örneği olmadan, sözcük olarak eklenmiş bir sınıf örneği oluşturuyorum.
class A; class B; end; end
A::B.new
Avantajlar modüller için olanlarla aynıdır: kapsülleme, sadece bir yerde kullanılan gruplama kodu ve kodu kullanıldığı yere daha yakın yerleştirme. Büyük bir projede, her kaynak dosyada tekrar tekrar ortaya çıkan ve çok sayıda sınıf tanımı içeren bir dış modül olabilir. Çeşitli çerçeveler ve kütüphane kodlarının hepsi bunu yaptığında, her biri en üst seviyeye sadece bir isim ekleyerek çatışma olasılığını azaltır. Prosaic, emin olmak için, ama bu yüzden kullanılıyorlar.
Dış ad alanını tanımlamak için modül yerine sınıf kullanmak tek dosyalı bir programda veya komut dosyasında veya bir şey için zaten üst düzey sınıf kullanıyorsanız veya sınıfları birbirine bağlamak için kod ekleyecekseniz mantıklı olabilir. gerçek iç sınıf tarzında. Ruby'nin iç sınıfları yoktur, ancak hiçbir şey koddaki aynı davranış hakkında yaratmanızı engellemez. Dış nesnelerin iç nesnelerden referans alması için yine de dış nesnenin örneğinden noktalama yapılması gerekecektir, ancak sınıfları iç içe yerleştirmek, bunun yapabileceğiniz şey olduğunu düşündürecektir. Dikkatle modüler hale getirilmiş bir program her zaman ilk olarak ek sınıfları yaratabilir ve makul şekilde iç içe veya iç sınıflarla ayrıştırılabilir. Sen diyemezsin new
bir modül üzerinde.
Genel kalıbı, ad alanının çok fazla ihtiyaç duyulmadığı komut dosyaları için bile, sadece eğlence ve pratik için kullanabilirsiniz ...
#!/usr/bin/env ruby
class A
class Realwork_A
...
end
class Realwork_B
...
end
def run
...
end
self
end.new.run
Car.new
ve arasında bir ilişki kurarak ne demek istediğinizden emin değilimCar::Wheel.new
. Ruby'deCar
birCar::Wheel
nesneyi başlatmak için kesinlikle bir nesne başlatmanız gerekmez , ancak kullanılabilirCar
olması için sınıfın yüklenmesi ve yürütülmesi gerekirCar::Wheel
.