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::io
Alt 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. rustc
Tek 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_a
alt modül olduğunu umursamasını istemiyoruz . Bunun yerine, onu math::vector
modülde kullanıma sunmak istiyoruz . Bu, tanımlayıcıyı mevcut modülde pub use self::vector_a::VectorA
yeniden 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.rs
dosyamı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 VectorA
ve VectorB
iki 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.