Kod düzenlemenin arkasındaki kavramları anlama

Tamamlandı

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.rsbir paketimiz var, yani yalnızca adlı my-projectikili 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.rsiç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 pubbildirildiğ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.