基本程式碼組織
讓我們看看當程式碼庫變大時我們如何組織程式碼。
01.功能
fn main() {
greet();
}
fn greet() {
println!("Hello, world!");
}
02.模組 - 在同一個檔案中
fn main() {
greet::hello();
}
mod greet {
// By default, everything inside a module is private
pub fn hello() { // So function has to be public to access from outside
println!("Hello, world!");
}
}
03.模組 - 在同一目錄中的不同檔案中
將一些程式碼移動到新檔案時,無需將程式碼包裝在 mod
宣告中。檔案本身就是一個模組。
// ↳ main.rs
mod greet; // import greet module
fn main() {
greet::hello();
}
// ↳ greet.rs
pub fn hello() { // function has to be public to access from outside
println!("Hello, world!");
}
將一些程式碼移動到新檔案時,如果該程式碼已經從
mod
宣告包裝,那麼它將是該檔案的子模組。
// ↳ main.rs
mod greet;
fn main() {
greet::hello::greet();
}
// ↳ greet.rs
pub mod hello { // module has to be public to access from outside
pub fn greet() { // function has to be public to access from outside
println!("Hello, world!");
}
}
04.模組 - 在不同目錄中的不同檔案中
將某些程式碼移動到不同目錄中的新檔案時,目錄本身就充當模組。模組根目錄中的 mod.rs
是目錄模組的入口點。該目錄中的所有其他檔案充當該目錄的子模組。
// ↳ main.rs
mod greet;
fn main() {
greet::hello();
}
// ↳ greet/mod.rs
pub fn hello() {
println!("Hello, world!");
}
當模組根目錄中有多個檔案時,
// ↳ main.rs
mod greet;
fn main() {
greet::hello_greet()
}
// ↳ greet/mod.rs
mod hello;
pub fn hello_greet() {
hello::greet()
}
// ↳ greet/hello.rs
pub fn greet() {
println!("Hello, world!");
}
05.模組 - 與 self
fn main() {
greet::call_hello();
}
mod greet {
pub fn call_hello() {
self::hello();
}
fn hello() {
println!("Hello, world!");
}
}
06.模組 - 與 super
- 如果要從模組內部訪問根函式,
fn main() {
dash::call_hello();
}
fn hello() {
println!("Hello, world!");
}
mod dash {
pub fn call_hello() {
super::hello();
}
}
- 如果要從巢狀模組內部訪問外部/父模組中的函式,
fn main() {
outer::inner::call_hello();
}
mod outer {
pub fn hello() {
println!("Hello, world!");
}
mod inner {
pub fn call_hello() {
super::hello();
}
}
}
07.模組 - 與 use
- 如果要將完整路徑繫結到新名稱,
use greet::hello::greet as greet_hello;
fn main() {
greet_hello();
}
mod greet {
pub mod hello {
pub fn greet() {
println!("Hello, world!");
}
}
}
- 當你想要使用 crate 範圍級別內容時
fn main() {
user::hello();
}
mod greet {
pub mod hello {
pub fn greet() {
println!("Hello, world!");
}
}
}
mod user {
use greet::hello::greet as call_hello;
pub fn hello() {
call_hello();
}
}