Kod düzenlemenin arkasındaki kavramları anlama
Başlamadan önce Rust programlarında kod düzenlemesinin arkasındaki kavramları açıklamak önemlidir:
- Paket:
- Bir veya daha fazla kasa içinde işlevsellik içerir.
- Bu sandıkların nasıl inşası hakkında bilgi içerir. Bilgiler dosyadadır
Cargo.toml
.
- Bir sandık:
- Rust derleyicisinin üzerinde çalışabileceği en küçük kod miktarı olan bir derleme birimidir.
- Derledikten sonra yürütülebilir dosya veya kitaplık oluşturur.
- Örtük, adsız bir üst düzey modül içerir.
- Bir modül:
- Bir kasa içinde kod düzenlemesinin (büyük olasılıkla iç içe yerleştirilmiş) bir birimidir.
- Ek modülleri kapsayan özyinelemeli tanımları olabilir.
Paket
komutunu $ cargo new <project-name>
her çalıştırışımızda Kargo bizim için bir paket oluşturur:
$ cargo new my-project
Created binary (application) `my-project` package
Burada yalnızca öğesini içeren src/main.rs
bir paketimiz var, yani yalnızca adlı my-project
ikili bir kasa içeriyor:
my-project
├── src
│ └── main.rs
└── Cargo.toml
Bir paket, dizine dosya yerleştirerek birden çok ikili kasaya src/bin
sahip olabilir. Her dosya ayrı bir ikili kasa olacaktır.
Bir paket ve src/lib.rs
içeriyorsasrc/main.rs
, iki kasası vardır: kitaplık ve ikili. Her ikisi de paketle aynı ada sahiptir.
Kasa
Rust'ın derleme modeli, ikili veya kitaplıkta derlenebilir kasalar olarak adlandırılan yapıtları ortalar.
Komutuyla cargo new
oluşturduğunuz her proje bir sandıktır. Projenizde bağımlılık olarak kullanabileceğiniz tüm üçüncü taraf Rust kodları da tek bir kasadır.
Kitaplık kasaları
İkili program oluşturmayı zaten ele aldık ve kitaplık oluşturmak da bu kadar kolaydır. Kitaplık oluşturmak için komut satırı parametresini komutuna cargo new
geçirin--lib
:
$ cargo new --lib my-library
Created library `my-library` package
Artık bir src/main.rs
dosya yerine =src/lib.rs' dosyası aldığınızı görebilirsiniz.
my-library
├── src
│ └── lib.rs
└── Cargo.toml
Kargo'ya bu sandığı derlemesini söyleyince, yayımlanıp diğer projelere bağlanabilen adlı libmy_library.rlib
bir kitaplık dosyası alırsınız.
Modül
Rust, kodu hiyerarşik olarak okunabilirliği ve yeniden kullanımı kolaylaştıran mantıksal birimlere bölmek için kullanılabilecek güçlü bir modül sistemi sağlar.
Modül bir öğe koleksiyonudur:
- Sabitler
- Tür diğer adları
- İşlevler
- Yapılar
- Numaralandırmalar
- Özellik
impl
Blok- Diğer modüller
Modüller ayrıca öğe gizliliğini de denetler. Öğe gizliliği, bir öğeyi genel veya özel olarak tanımlar. Ortak, öğenin dış kod tarafından kullanılabildiği anlamına gelir. Özel, öğenin bir iç uygulama ayrıntısı olduğu ve dış kullanım için kullanılamadığı anlamına gelir.
Modül örneği:
mod math {
type Complex = (f64, f64);
pub fn sin(f: f64) -> f64 { /* ... */ }
pub fn cos(f: f64) -> f64 { /* ... */ }
pub fn tan(f: f64) -> f64 { /* ... */ }
}
println!("{}", math::cos(45.0));
Kaynak dosyanın mod
içinde bildirimler varsa, derleyici üzerinde çalıştırılmadan önce modül dosyalarının içeriği kaynak dosyadaki bildirimlerin bulunduğu yerlere mod
eklenir. Başka bir deyişle modüller ayrı ayrı derlenemez, yalnızca sandıklar derlenecektir.
Modüldeki pub
işlev tanımlarının başında anahtar sözcüğünü math
fark etmiş olabilirsiniz.
Rust derleyicisi, öğelerin modüller arasında kullanılıp kullanılamayacağını denetler. Varsayılan olarak Rust'taki her şey özeldir ve yalnızca geçerli modül ve alt öğeleri tarafından erişilebilir. Buna karşılık, bir öğe olarak pub
bildirildiğinde, bunun dış dünya için erişilebilir olduğu düşünülebilir. Örneğin:
// Declare a private struct
struct Foo;
// Declare a public struct with a private field
pub struct Bar {
field: i32,
}
// Declare a public enum with two public variants
pub enum State {
PubliclyAccessibleVariant,
PubliclyAccessibleVariant2,
}
Rust'ın gizlilik kuralları, iç uygulama ayrıntılarını gizlerken genel API'leri ortaya çıkarmak için modül hiyerarşileri oluşturmak için şaşırtıcı derecede güçlü bir araçtır.