Modülleri Farklı Dosyalara Ayırma
Şimdiye kadar bu bölümdeki tüm örnekler birden fazla modülü tek bir dosyada tanımladı. Modüller büyüdüğünde, kod içinde gezinmeyi (navigate) kolaylaştırmak için modül tanımlarını ayrı bir dosyaya taşımak isteyebilirsiniz.
Örneğin, birden çok restoran modülü içeren Liste 7-17’deki koddan başlayalım. Tüm modülleri crate kök dosyasında tanımlamak yerine, modülleri ayrı dosyalara çıkaracağız. Bu durumda crate kök dosyası src/lib.rs’dir, ancak bu prosedür, crate kök dosyası src/main.rs olan ikili crate’lerde de çalışır.
İlk olarak restoran_on_kisim modülünü kendi dosyasına çıkaracağız. restoran_on_kisim modülü için süslü parantezlerin içindeki kodu kaldırın ve src/lib.rs’in Liste 7-21’de gösterilen kodu içermesi için sadece mod restoran_on_kisim; bildirimini (declaration) bırakın. Liste 7-22’deki src/restoran_on_kisim.rs dosyasını oluşturana kadar bu kodun derlenmeyeceğini unutmayın.
mod restoran_on_kisim;
pub use crate::restoran_on_kisim::karsilama;
pub fn restoranda_yemek_ye() {
karsilama::bekleme_listesine_ekle();
}
restoran_on_kisim modülünü bildirmekDaha sonra, Liste 7-22’de gösterildiği gibi, süslü parantezlerin içinde bulunan kodu src/restoran_on_kisim.rs adlı yeni bir dosyaya yerleştirin. Derleyici, bu dosyaya bakması gerektiğini bilir çünkü crate kökünde restoran_on_kisim adında bir modül bildirimiyle karşılaşmıştır.
pub mod karsilama {
pub fn bekleme_listesine_ekle() {}
}
restoran_on_kisim modülünün tanımlarıModül ağacınızda bir dosyayı yüklemek için mod bildirimini yalnızca bir kez kullanmanız gerektiğini unutmayın. Derleyici, dosyanın projenin bir parçası olduğunu bildiğinde (ve mod ifadesini nereye koyduğunuzdan dolayı kodun modül ağacının neresinde bulunduğunu anladığında), projenizdeki diğer dosyalar yüklenen dosyanın koduna “Modül Ağacındaki Bir Öğeye Başvurmak İçin Yollar (Paths)” bölümünde anlatıldığı gibi o dosyanın nerede tanımlandığını gösteren bir yol kullanarak atıfta bulunmalıdır. Başka bir deyişle, mod diğer programlama dillerinde görmüş olabileceğiniz bir “include” (dahil etme) işlemi değildir.
Sonraki adımda, karsilama modülünü kendi dosyasına çıkaracağız. Bu süreç biraz farklıdır çünkü karsilama, kök (root) modülünün değil, restoran_on_kisim modülünün bir alt modülüdür. karsilama dosyasını modül ağacındaki ata modüllerine göre adlandırılacak yeni bir dizine, bu durumda src/restoran_on_kisim dizinine yerleştireceğiz.
karsilama modülünü taşımaya başlamak için src/restoran_on_kisim.rs dosyasını, yalnızca karsilama modülünün bildirimini içerecek şekilde değiştiriyoruz:
pub mod karsilama;
Daha sonra, karsilama modülünde yapılan tanımları içermesi için src/restoran_on_kisim adlı bir dizin ve içinde bir karsilama.rs dosyası oluşturuyoruz:
pub fn bekleme_listesine_ekle() {}
Eğer karsilama.rs dosyasını src dizinine koysaydık derleyici karsilama.rs kodunun, restoran_on_kisim modülünün bir alt modülü olarak değil de doğrudan crate kökünde bildirilen bir karsilama modülünde olmasını beklerdi. Derleyicinin hangi modüllerin kodu için hangi dosyaları kontrol edeceğine dair kuralları, dizinlerin ve dosyaların modül ağacıyla daha yakından eşleştiği anlamına gelir.
Alternatif Dosya Yolları
Şimdiye kadar Rust derleyicisinin kullandığı en idiomatik dosya yollarını ele aldık, ancak Rust daha eski bir dosya yolu stilini de destekler. Crate kökünde tanımlanan restoran_on_kisim adlı bir modül için derleyici modülün kodunu şurada arayacaktır:
- src/restoran_on_kisim.rs (bizim işlediğimiz)
- src/restoran_on_kisim/mod.rs (daha eski stil, hala desteklenen yol)
restoran_on_kisim modülünün alt modülü olan karsilama adlı bir modül için ise, derleyici modülün kodunu şurada arayacaktır:
- src/restoran_on_kisim/karsilama.rs (bizim işlediğimiz)
- src/restoran_on_kisim/karsilama/mod.rs (daha eski stil, hala desteklenen yol)
Aynı modül için her iki stili de kullanırsanız, derleyici hatası alırsınız. Aynı projedeki farklı modüller için her iki stili bir arada kullanmaya izin verilir ancak projenizde gezinen kişiler için kafa karıştırıcı olabilir.
mod.rs adlı dosyaları kullanan stilin ana dezavantajı, projenizde mod.rs adlı birçok dosyanın bulunması ve bu dosyaların editörünüzde aynı anda açık olduğunda kafa karışıklığı yaratabilmesidir.
Her modülün kodunu ayrı bir dosyaya taşıdık ve modül ağacı aynı kaldı. restoranda_yemek_ye içindeki fonksiyon çağrıları, tanımlar farklı dosyalarda yaşasa bile herhangi bir değişiklik olmadan çalışacaktır. Bu teknik, modüllerin boyutları büyüdükçe onları yeni dosyalara taşımanıza olanak tanır.
src/lib.rs içindeki pub use crate::restoran_on_kisim::karsilama ifadesinin de değişmediğine ve use anahtar kelimesinin crate’in bir parçası olarak hangi dosyaların derlendiği üzerinde hiçbir etkisinin olmadığına dikkat edin. mod anahtar kelimesi modülleri tanımlar (declare) ve Rust o modülün içine giren kod için modülle aynı ada sahip bir dosyaya bakar.
Özet
Rust, bir modülde tanımlanan öğelere başka bir modülden atıfta bulunabilmeniz (refer to) için bir paketi birden çok crate’e ve bir crate’i birden çok modüle bölmenizi sağlar. Bunu mutlak veya göreceli yollar (absolute or relative paths) belirterek yapabilirsiniz. Bu yollar, o kapsamda öğenin birden çok kullanımı için daha kısa bir yol kullanabilmeniz adına use ifadesiyle kapsama dahil edilebilir. Modül kodu varsayılan olarak gizlidir, ancak pub anahtar kelimesini ekleyerek tanımları açık hale getirebilirsiniz.
Bir sonraki bölümde, standart kütüphanede (standard library) bulunan ve kendi düzenli organize edilmiş kodunuzda kullanabileceğiniz bazı koleksiyon veri yapılarına (collection data structures) bakacağız.