ระบบโมดูลของ 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
คำสั่งในการคอมไพล์และรันยังคงเหมือนเดิมเช่นกัน