基本代码组织
让我们看看当代码库变大时我们如何组织代码。
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();
}
}