【Rust自学】7.3. 路径(Path)Pt.2:访问父级模块、pub关键字在结构体和枚举类型上的使用

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

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,那就是私有的。(下文会讲到特例)

将字段设为公有也很简单。下面展示一下把Breakfasttoast改为公有后的代码:

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下部分字段是私有的并不会影响它的使用。

但需要注意的是,枚举类型下的变体是公共的前提条件这个枚举类型被声明为公共的

相关推荐
桃子酱紫君11 分钟前
华为配置篇-BGP实验
开发语言·华为·php
QTX1873023 分钟前
JavaScript 中的原型链与继承
开发语言·javascript·原型模式
shaoing27 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
Asthenia041228 分钟前
由浅入深解析Redis事务机制及其业务应用-电商场景解决超卖
后端
Asthenia041229 分钟前
Redis详解:从内存一致性到持久化策略的思维链条
后端
Asthenia041229 分钟前
深入剖析 Redis 持久化:RDB 与 AOF 的全景解析
后端
Apifox40 分钟前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
掘金一周1 小时前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端
The Future is mine1 小时前
Python计算经纬度两点之间距离
开发语言·python
Enti7c1 小时前
HTML5和CSS3的一些特性
开发语言·css3