基本代码组织

让我们看看当代码库变大时我们如何组织代码。

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();
  }
}