Rust - crate ve moduller
Apr 2, 2020 · 2 minute read · Commentsprogrammingrust
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.