İlişkili kodlar ve veriler bir tek modülde gruplanır ve aynı dosya içinde saklanır:
mod selamla {
// ⭐️ Varsayılan olarak, bir modül içindeki her şey özeldir
// Bu yüzden işlevin herkesin dışarıdan erişimine açık olması gerekir
pub fn merhaba() {
println!("Merhaba dünya!");
}
}
fn main() {
selamla::merhaba();
}
// Merhaba dünya!
Modüller iç içe geçmiş olarak bildirilebilirler:
mod soylemler {
pub mod selamlar {
pub fn merhaba () {
println!("Merhaba dünya!");
}
}
}
fn main() {
soylemler::selamlar::merhaba();
}
// Merhaba dünya!
Özel işlevler aynı modül veya bir alt modülden çağırılabilirler. Aşağıdaki örnek aynı modülün özel işlevini çağırmaktadır:
mod soylemler {
pub fn selam() {
merhaba(); // ya da `self::merhaba();`
}
fn merhaba() {
println!("Merhaba dünya!");
}
}
fn main() {
soylemler::selam();
}
// Merhaba dünya!
Aşağıdaki örnekte ise üst modülün özel işlevi çağrılmaktadır:
mod soylemler {
fn ozel_bir_islev() {
println!("Merhaba dünya!");
}
pub mod selamla {
pub fn merhaba() {
// açıklamasına aşağıdan ulaşabilirsiniz
super::ozel_bir_islev();
}
}
}
fn main() {
soylemler::selamla::merhaba();
}
// Merhaba dünya!
💡 self
anahtar sözcüğü aynı modülü belirtmek için kullanılırken, super
anahtar sözcüğü üst modülü belirtmek için kullanılır. Ayrıca, super
anahtar sözcüğü bir modülün içinden kök işlevlerine erişmek için kullanılabilir.
mod selamlama {
pub fn merhaba() {
super::merhaba();
}
}
fn merhaba() {
println!("Merhaba dünya");
}
fn main() {
selamlama::merhaba();
}
// Merhaba dünya!
🔎 Test kodlarını yazarken bütün test kodlarını ayrı bir test modülünün içine almanız, bu kodlar yalnızca test aşamasında derleneceklerinden iyi bir yaklaşım olur.
// Test kodlarında dönüş türü kullanılmalıdır
// yani bir prosedür deüil bir işlev yazılmalıdır
fn selam() -> String {
"Merhaba dünya!".to_string()
}
#[cfg(test)] // sadece test aşamasında derlenecektir
mod tests {
use super::selam; // Kök selam işlevini içe aktarma
#[test]
fn test_selam() {
assert_eq!("Merhaba dünya!", selam());
}
}
/*
running 1 test
test tests::test_selam ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
*/
// ↳ main.rs mod selamla; // selamla modulünün içe aktarılması
fn main() { selamla::merhaba(); }
// ↳ selamla.rs // ⭐ Dosyanın kendisi bir modül olarak davranacağından // kodu mod bildirimi ile sarmak gereksizdir.
pub fn merhaba() {
// Bu işleve dışarıdan erişilebilmesi için pub
anahtar
// kelimesi kullanılarak erişime açılması gerekmektedir.
println!("Merhaba dünya!");
}
// Merhaba dünya!
Eğer dosya içeriği mod
bildirimi ile sarmalanırsa, bu dosya iç içe geçmiş modüller olarak kabul edilir:
// ↳ main.rs
mod soylemler;
fn main() {
soylemler::selamla::merhaba();
}
// ↳ soylemler.rs
pub mod selamla {
// Bu işleve dışarıdan erişilebilmesi için `pub` anahtar
// kelimesi kullanılarak erişime açılması gerekmektedir.
pub fn merhaba() {
println!("Merhaba dünya!");
}
}
// Merhaba dünya!
Dizin modülünün kök dizininde bulunan mod.rs
, dizin modülüne giriş noktasıdır. Bu dizin kökünde bulunan diğer dosyaların tümü dizin modülünün alt modülleri olarak kabul edilir:
// ↳ main.rs
mod selamla;
fn main() {
selamla::merhaba();
}
// ↳ selamla/mod.rs
// Bu işleve dışarıdan erişilebilmesi için `pub` anahtar
// kelimesi kullanılarak erişime açılması gerekmektedir.
pub fn merhaba() {
println!("Merhaba dünya!");
}
// Merhaba dünya!
Yine burada da eğer dosya içeriği mod
bildirimi ile sarmalanırsa, iç içe geçmiş modül olarak davranmaya başlar:
// ↳ main.rs
mod soylemler;
fn main() {
soylemler::selamla::merhaba();
}
// ↳ soylemler/mod.rs
pub mod selamla {
pub fn merhaba() {
println!("Merhaba dünya!");
}
}
// Merhaba dünya!
Dizin modülündeki diğer dosyalar mod.rs
için alt modül görevi üstlenir:
// ↳ main.rs
mod soylemler;
fn main() {
soylemler::merhaba()
}
// ↳ soylemler/mod.rs
mod selamla;
pub fn merhaba() {
selamla::merhaba()
}
// ↳ soylemler/selamla.rs
pub fn merhaba() {
println!("Merhaba dünya!");
}
// Merhaba dünya!
⭐️ Modülün dışından bir "soylemler/selamla.rs" öğesine erişmeniz gerekiyorsa, selamla
modülünü pub
anahtar sözcüğünü kullanarak genel erişime açık modül olarak içe aktarmanız gerekir.
// ↳ main.rs
mod soylemler;
fn main() {
soylemle::selamla::merhaba();
}
// ↳ soylemler/mod.rs
pub mod selamla; // ⭐️ `mod` yerine`pub mod`
// ↳ soylemler/selamla.rs
pub fn merhaba() {
println!("Merhaba dünya!");
}
// Merhaba dünya!
🔎 Dizin modülü aracılığıyla alt dosya modülleri
main.rs
içine aktarılamayacağındanmain.rs
içerisindenmod soylemler::selamla
gibi ifadeler kullanılamaz. Bununla birlikte gerek duyulduğundasoylemler
dizini içindekiselamla
dosyasında bulunanmerhaba()
işlevini,soylemler::selamla::merhaba()
söz dizimiyle ithal edebiliriz. Bu şekilde yapılan bir ithal işleminden sonra işlev,soylemler::merhaba()
şeklinde doğrudan kullanıma hazır olacaktır.
// ↳ soylemler/selamla.rs
pub fn merhaba() {
println!("Merhaba dünya!");
}
// ↳ soylemler/mod.rs
pub mod selamla;
// `self::selamla::merhaba` ifadesiyle
// soylemler içine yeniden ithal edilir
pub use self::selamla::merhaba;
// ↳ main.rs
mod soylemler;
fn main() {
// Artık `merhaba()` işlevi soylemler
// içinden direk olarak çağırılabilir.
soylemler::merhaba();
}
// Merhaba dünya!
Bu yönelim program kod düzenlememizle doğrudan uyuşmayabilecek bir dış arabirim oluşturmamızı sağlar. Haliyle bu tür yönelimler kod karmaşasına sebep olabilir. Böyle karışıklıkların üstesinden gelebilmek için use
anahtar sözcüğü kullanılmaktadır.