Rust'un modül sistemi aslında inanılmaz derecede esnektir ve kodunuzun dosyalarda nasıl yapılandırıldığını gizlerken istediğiniz türden yapıyı ortaya çıkarmanıza izin verir.
Bence buradaki anahtar pub use, diğer modüllerden tanımlayıcıları yeniden dışa aktarmanıza izin verecek şekilde yararlanmaktır. std::ioAlt modüllerden bazı türlerin kullanım için yeniden ihraçstd::io edildiği Rust'un sandığında bunun için bir emsal var .
Düzenleme (2019-08-25): Cevabın aşağıdaki kısmı oldukça uzun bir süre önce yazılmıştır. rustcTek başına böyle bir modül yapısının nasıl kurulacağını açıklar . Bugün, çoğu kullanım durumu için genellikle Cargo kullanılır. Aşağıdakiler hala geçerli olsa da, bazı kısımları (örneğin #![crate_type = ...]) tuhaf görünebilir. Bu önerilen çözüm değildir.
Örneğinizi uyarlamak için şu dizin yapısıyla başlayabiliriz:
src/
lib.rs
vector.rs
main.rs
İşte sizin main.rs:
extern crate math;
use math::vector;
fn main() {
println!("{:?}", vector::VectorA::new());
println!("{:?}", vector::VectorB::new());
}
Ve sizin src/lib.rs:
#[crate_id = "math"];
#[crate_type = "lib"];
pub mod vector;
Ve son olarak src/vector.rs:
pub use self::vector_a::VectorA;
pub use self::vector_b::VectorB;
mod vector_b;
mod vector_a {
#[derive(Debug)]
pub struct VectorA {
xs: Vec<i64>,
}
impl VectorA {
pub fn new() -> VectorA {
VectorA { xs: vec![] }
}
}
}
Ve sihrin gerçekleştiği yer burasıdır. math::vector::vector_aÖzel bir vektör türünün bazı uygulamalarını içeren bir alt modül tanımladık . Ancak kütüphanenizin müşterilerinin bir vector_aalt modül olduğunu umursamasını istemiyoruz . Bunun yerine, onu math::vectormodülde kullanıma sunmak istiyoruz . Bu, tanımlayıcıyı mevcut modülde pub use self::vector_a::VectorAyeniden dışa aktaran ile yapılır vector_a::VectorA.
Ancak özel vektör uygulamalarınızı farklı dosyalara koyabilmeniz için bunu nasıl yapacağınızı sordunuz. Bu nedir mod vector_b;hat yok. Rust derleyicisine vector_b.rs, o modülün uygulanması için bir dosya aramasını söyler. Ve tabii ki, işte src/vector_b.rsdosyamız:
#[derive(Debug)]
pub struct VectorB {
xs: Vec<i64>,
}
impl VectorB {
pub fn new() -> VectorB {
VectorB { xs: vec![] }
}
}
Müşterinin bakış açısından, gerçeği VectorAve VectorBiki farklı dosyalarda iki farklı modüllerde tanımlanan tamamen opaktır.
İle aynı dizindeyseniz main.rs, aşağıdakilerle çalıştırabilmeniz gerekir:
rustc src/lib.rs
rustc -L . main.rs
./main
Genel olarak, Rust kitabındaki "Crates and Modules" bölümü oldukça iyidir. Çok sayıda örnek var.
Son olarak, Rust derleyicisi sizin için otomatik olarak alt dizinlere de bakar. Örneğin, yukarıdaki kod bu dizin yapısıyla değişmeden çalışacaktır:
src/
lib.rs
vector/
mod.rs
vector_b.rs
main.rs
Derleme ve çalıştırma komutları da aynı kalır.