7.3 路径PathPt.2访问父级模块、pub关键字在结构体和枚举类型上的使用7.3.1. super我们可以通过在路径开头使用super来访问父级模块路径中的内容就像使用..语法启动文件系统路径。例如fn deliver_order() {} mod back_of_house { fn fix_incorrect_order() { cook_order(); super::deliver_order(); } fn cook_order() {} }当然也可以用绝对路径实现同样的效果: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关键字加在struct前就可以把结构体声明为公共的如下例mod back_of_house { pub struct Breakfast { toast: String, seasonal_fruit: String, } }需要注意的是这个结构体虽然是公共的但结构体中的字段默认是私有的除非加上pub关键字。在Rust里绝大多数情况下如果某个东西没加pub那就是私有的。下文会讲到特例将字段设为公有也很简单。下面展示一下把Breakfast的toast改为公有后的代码mod back_of_house { pub struct Breakfast { pub toast: String, seasonal_fruit: String, } }我们再来看一个复杂点的代码例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构造器中写的。下一行中因为toast字段是公共的所以meal.toast可以直接被更改这里是改为了Wheat。在eat_at_restaurant这个函数中写下meal.seasonal_fruit String::from(blueberries);这一行会不会报错呢答案是会的因为结构体中的字段默认是私有的seasonal_fruit并没有被声明为公有所以外部代码无法修改它而这里这句话尝试进行修改所以就会报错。7.3.3. pub enum跟struct一样只要把pub关键字加上枚举类型也能变为公有的。如下例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下部分字段是私有的并不会影响它的使用。但需要注意的是枚举类型下的变体是公共的的前提条件是这个枚举类型被声明为公共的。