Rust - crate ve moduller

Bir proje yazmaya basladigimizda ilk dusundugumuz seylerden birisi projenin tahmini buyuklugune gore projenin dosya ve dizin yapisi oluyor.

Rust ogrenmeye basladigimda modul yapisi nasil calisiyor, kodu farkli dosya ve dizinlere nasil boluyoruz anlamakda biraz zorlanmistim. Tam olarak nasil calisiyor ogrendikten sonra da bu blog yazisini hazirladim. Umarim faydali bir yazi olmustur.

Crate

Crate diger dillerdeki paket veya kutuphane karsilik gelen sey. Crateler duruma gore kutuphane veya executable dosya olusturmaya yariyor.

cargo new foo dedigimizde foo adinda bir crate olusturmus oluyoruz.

Her cratenin bir kok modulu (crate root) olmasi gerekiyor ve bu kok modul diger alt modulleri crate’e dahil ediyor.

Rust projelerinde iki cesit crate root olabiliyor, biri main.rs digeri lib.rs. Eger executable bir create yazicaksak bizim crate rootumuz main.rs oluyor, eger bir kutuphane yaziyorsak crate root lib.rs dosyasi oluyor.

Crate’ler cikti olarak bir executable, bir library veye her ikisini verebiliyorlar. Bu yuzden kullanilacak butun sub modulleri bu dosyalar icerisine mod mod_name veya pub mod mod_name olarak eklememiz gerekiyor, eklenmedigi durumda modulleri crate’e dahil etmemis oluyoruz bu sebeple o modulleri kullanamiyoruz.

Moduller

Kodu farkli dosya ve dizinlere bolup duzgun bir yapida tutmak kaliteyi herzaman artiran bir faktor. Rust’in bu konudaki yaklasimi oldukca guzel.

.
├──product.rs
├──user/
│  ├──mod.rs
│  ├──profile.rs
│  │      pub struct Profile{}
│  └──employee.rs
└──main.rs // crate root
    mod user;
    mod product;

Yukaridaki ornegi incelersek;

main.rs dosyamiz var, bu bizim crate root‘umuz. Ayriyeten user ve product adinda iki modulumuz ve user altinda profile ve employee adinda iki sub-modulumuz var. Ayrica profile sub-modulu altinda Profile adinda public bir structimiz mevcut.

main.rs altindaki mod user ve mod product bizim modul tanimlamalarimiz oluyorlar. Rust crate’i compile ederken mod user satirini gordugunda user.rs veya user/mod.rs adinda bir dosya var mi diye bakip bu dosyayi modul olarak projeye dahil ediyor.

mod.rs dosyasi

mod.rs dosyasini kullanarak bir modul altindaki sub-modullerin birbirlerine erisilebilmesini veya modul disindan bu ve alt sub-modullere erisilebilmesini saglayabiliyoruz.

user/mod.rs dosyasi:

mod profile;  // profile modulunu user modulune sub-modul olarak dahil ediyoruz.
mod employee; // employee modulunu user modulune sub-modul olarak dahil ediyoruz.

pub use profile; // profile modulune hem iceriden hem disaridan erisime aciyoruz.
use employee; // Sadece user altindaki moduller employee modulune erisebilir.

Artik employee modulu icerisinden Profile struct’ina ulasmak icin use super::profile::Profile kullanabiliyoruz. Profile struct’ina product modulu icerisinden erismek icin ise crate::user::profile::Profile dememiz gerekiyor.

Module binding
// user/mod.rs dosyasi
mod profile;
mod employee;

pub use profile::Profile;

Burda profile modulunu import ettik ve Profile struct’ini user modulune bind ettik. Bu sayede Profile struct’ina erisim icin struct’in full-pathini yazmak zorunda kalmiyoruz. Artik employee modulu icerisindeyken super::Profile diyerek, product icerisinden ise crate::user::Profile diyerek Profile structimiza erisebiliriz.

Load comments