ระบบโมดูลของ Rust มีความยืดหยุ่นอย่างไม่น่าเชื่อและจะช่วยให้คุณสามารถเปิดเผยโครงสร้างแบบใดก็ได้ที่คุณต้องการในขณะที่ซ่อนว่าโค้ดของคุณมีโครงสร้างอย่างไรในไฟล์
ฉันคิดว่ากุญแจสำคัญในที่นี้คือการใช้ประโยชน์pub use
ซึ่งจะช่วยให้คุณสามารถส่งออกตัวระบุจากโมดูลอื่นได้อีกครั้ง มีแบบอย่างสำหรับสิ่งนี้ในstd::io
ลังของ Rust ซึ่งบางประเภทจากโมดูลย่อยจะถูกส่งออกอีกครั้งเพื่อใช้ในstd::io
.
แก้ไข (2019-08-25): คำตอบต่อไปนี้เขียนไว้เมื่อไม่นานมานี้ อธิบายวิธีการตั้งค่าโครงสร้างโมดูลด้วยตัวrustc
คนเดียว ทุกวันนี้ใคร ๆ ก็มักจะใช้ Cargo เป็นส่วนใหญ่ แม้ว่าสิ่งต่อไปนี้จะยังใช้ได้ แต่บางส่วน (เช่น#![crate_type = ...]
) อาจดูแปลก ๆ นี่ไม่ใช่วิธีแก้ปัญหาที่แนะนำ
ในการปรับตัวอย่างของคุณเราสามารถเริ่มต้นด้วยโครงสร้างไดเร็กทอรีนี้:
src/
lib.rs
vector.rs
main.rs
นี่คือmain.rs
:
extern crate math;
use math::vector;
fn main() {
println!("{:?}", vector::VectorA::new());
println!("{:?}", vector::VectorB::new());
}
และของคุณsrc/lib.rs
:
#[crate_id = "math"];
#[crate_type = "lib"];
pub mod vector;
และสุดท้าย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![] }
}
}
}
และนี่คือจุดที่ความมหัศจรรย์เกิดขึ้น เราได้กำหนดโมดูลย่อยmath::vector::vector_a
ซึ่งมีการนำเวกเตอร์ชนิดพิเศษมาใช้ แต่เราไม่ต้องการให้ไคลเอ็นต์ของไลบรารีของคุณสนใจว่ามีvector_a
โมดูลย่อยอยู่ แต่เราต้องการทำให้พร้อมใช้งานในmath::vector
โมดูล สิ่งนี้ทำได้โดยpub use self::vector_a::VectorA
ส่งออกvector_a::VectorA
ตัวระบุในโมดูลปัจจุบันอีกครั้ง
แต่คุณถามว่าจะทำอย่างไรเพื่อให้คุณสามารถใช้งานเวกเตอร์พิเศษของคุณในไฟล์ต่างๆได้ นี่คือสิ่งที่mod vector_b;
ไลน์ทำ มันสั่งให้คอมไพเลอร์ Rust ค้นหาvector_b.rs
ไฟล์สำหรับการใช้งานโมดูลนั้น และนี่คือsrc/vector_b.rs
ไฟล์ของเรา:
#[derive(Debug)]
pub struct VectorB {
xs: Vec<i64>,
}
impl VectorB {
pub fn new() -> VectorB {
VectorB { xs: vec![] }
}
}
จากมุมมองของลูกค้าความจริงที่ว่าVectorA
และVectorB
ถูกกำหนดไว้ในโมดูลที่แตกต่างกันสองโมดูลในสองไฟล์ที่แตกต่างกันนั้นทึบทั้งหมด
หากคุณอยู่ในไดเร็กทอรีเดียวกับmain.rs
คุณควรจะสามารถเรียกใช้ด้วย:
rustc src/lib.rs
rustc -L . main.rs
./main
โดยทั่วไปบท"Crates and Modules"ในหนังสือ Rust นั้นค่อนข้างดี มีตัวอย่างมากมาย
สุดท้ายคอมไพเลอร์ Rust ยังค้นหาในไดเรกทอรีย่อยให้คุณโดยอัตโนมัติ ตัวอย่างเช่นโค้ดด้านบนจะทำงานโดยไม่เปลี่ยนแปลงกับโครงสร้างไดเร็กทอรีนี้:
src/
lib.rs
vector/
mod.rs
vector_b.rs
main.rs
คำสั่งในการคอมไพล์และรันยังคงเหมือนเดิมเช่นกัน