喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=^・ω・^=)
7.3.1. super
我们可以通过在路径开头使用super
来访问父级模块路径中的内容,就像使用..
语法启动文件系统路径。例如:
rust
fn deliver_order() {}
mod back_of_house {
fn fix_incorrect_order() {
cook_order();
super::deliver_order();
}
fn cook_order() {}
}
当然也可以用绝对路径实现同样的效果:
rust
fn deliver_order() {}
mod back_of_house {
fn fix_incorrect_order() {
cook_order();
crate::deliver_order();
}
fn cook_order() {}
}
7.3.2. pub struct
把pub
关键字加在stuct
前就可以把结构体声明为公共的,如下例:
rust
mod back_of_house {
pub struct Breakfast {
toast: String,
seasonal_fruit: String,
}
}
需要注意的是,这个结构体虽然是公共的,但结构体中的字段默认是私有的 ,除非加上pub
关键字。
在Rust里,绝大多数情况下 如果某个东西没加pub
,那就是私有的。(下文会讲到特例)
将字段设为公有也很简单。下面展示一下把Breakfast
的toast
改为公有后的代码:
rust
mod back_of_house {
pub struct Breakfast {
pub toast: String,
seasonal_fruit: String,
}
}
我们再来看一个复杂点的代码例:
rust
mod back_of_house {
pub struct Breakfast {
pub toast: String,
seasonal_fruit: String,
}
impl Breakfast {
pub fn summer(toast: &str) -> Breakfast {
Breakfast {
toast: String::from(toast),
seasonal_fruit: String::from("peaches"),
}
}
}
}
pub fn eat_at_restaurant(){
let mut meal = back_of_house::Breakfast::summer("Rye");
meal.toast = String::from("Wheat");
}
- 在刚才的结构体之上,又构造了一个关联函数
summer
,参数是字符串切片类型的toast
,返回值是Breakfast
类型,Breakfast.toast
的值会是传进来的这个参数的值,Breakfast.seasonal_fruit
的值则会被设为peaches。summer
这个函数本质上是一个构造器,构造了Breakfast
的实例 - 在
eat_at_restaurant
这个函数中先使用相对路径调用了summer
这个构造器构造了一个实例,把它赋给了可变变量meal
。而meal
中的toast
字段被设为了Rye,seasonal_fruit
的值则是peaches(构造器中写的)。
下面一行中,因为Breakfast
这个结构体是公共的所以meal.toast
可以直接被更改,这里是改为了Wheat。
在eat_at_restaurant
这个函数中写下meal.seasonal_fruit = String::from("buleberries");
这一行会不会报错呢?答案是会的,因为结构体中的字段默认是私有的 ,seasonal_fruit
并没有被声明为公有,所以外部代码无法修改它,而这里这句话尝试进行修改,所以就会报错。
7.3.3. pub enum
根struct
一样,只要把pub
关键字加上枚举类型也能变为公有的。如下例:
rust
mod back_of_house {
pub enum Appetizer {
Soup,
Salad,
}
}
pub fn eat_at_restaurant() {
let order1 = back_of_house::Appetizer::Soup;
let order2 = back_of_house::Appetizer::Salad;
}
但于struct
不同,struct
下的字段默认是私有的,而公共的枚举类型下的变体默认就是公共的,不需要把pub
关键字加在变体之前。这一点和Rust默认私有的规则不一样,因为只有公共的枚举类型下是公共的变体它才有用,而struct
下部分字段是私有的并不会影响它的使用。
但需要注意的是,枚举类型下的变体是公共的 的前提条件 是这个枚举类型被声明为公共的。