rust 初探 -- 路径Path
路径(Path)
- 目的:为了在 Rust 的模块中找到某个条目,需要使用 路径
- 两种形式:
- 绝对路径:从 crate root 开始,使用 crate 名或字面值 crate
- 相对路径:从当前模块开始,使用 self,super 或当前模块的标识符
- 路径至少由一个标识符组成,标识符之间使用 ::
示例:
rust
mod front_of_house {
// pub mod hosting {
mod hosting {
// fn add_to_waitlist() {}
fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
//使用绝对路径调用
crate::front_of_house::hosting::add_to_waitlist();
// --------------- function `add_to_waitlist` is not publicly re-exported
// 因为是私有的
//使用相对路径调用
front_of_house::hosting::add_to_waitlist();
}
私有边界(privacy boundary)
- 模块不仅可以组织代码,还可以定义私有边界
- 如果想把函数或struct 等设为私有,将其放到某个模块中即可
- Rust 中所有的条目默认是私有的
- 父级模块无法访问子模块中的私有条目
- 子模块里可以使用所有祖先模块中的条目
pub 关键字
- 使用 pub 可以将某些条目设置为公共的
super 关键字
- 用于访问父级模块路径中的内容,相当于文件目录中的 ...
rust
fn sever_order() {}
mod back_of_house {
fn fix_incorrect_order() {
cook_order();
super::sever_order();//进入到模块外面
// crate::sever_order();
}
fn cook_order() {}
}
pub struct
- pub 放在 struct 之前:struct 是公共的,里面的字段默认不是公共的(除非加上 pub)
rust
mod back_of_house {
pub struct Breakfast {
pub toast: String,
fruit: String,
}
// 关联函数
impl Breakfast {
pub fn summer(toast: &str) -> Breakfast {
Breakfast {
toast: String::from(toast),
fruit: String::from("peach"),
}
}
}
}
pub fn eat_at_restaurant() {
let mut meal = back_of_house::Breakfast::summer("rye");
meal.toast = String::from("wheat");
// meal.fruit = String::from("apple");//field `fruit` of `Breakfast` is private
println!("{}", meal.toast)
}
上述示例中,meal.toast 可以访问,但是meal.fruit 因为是私有的,不能访问。
pub enum
- 和 struct 不一样,如果枚举是公共的,那么它里面的所有枚举默认就是公共的