基本程式碼組織

讓我們看看當程式碼庫變大時我們如何組織程式碼。

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

  1. 如果要從模組內部訪問根函式,
fn main() {
  dash::call_hello();
}

fn hello() {
  println!("Hello, world!");
}

mod dash {
  pub fn call_hello() {
    super::hello();
  }
}
  1. 如果要從巢狀模組內部訪問外部/父模組中的函式,
fn main() {
  outer::inner::call_hello();
}

mod outer {

  pub fn hello() {
    println!("Hello, world!");
  }

  mod inner {
    pub fn call_hello() {
      super::hello();
    }
  }

}

07.模組 - 與 use

  1. 如果要將完整路徑繫結到新名稱,
use greet::hello::greet as greet_hello;

fn main() {
  greet_hello();
}

mod greet {
  pub mod hello {
    pub fn greet() {
      println!("Hello, world!");
    }
  }
}
  1. 當你想要使用 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();
  }
}