当前位置: 首页 > article >正文

【Rust自学】7.3. 路径(Path)Pt.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关键字加在stuct前就可以把结构体声明为公共的,如下例:

mod back_of_house {
	pub struct Breakfast {
		toast: String,
		seasonal_fruit: String,
	}
}

需要注意的是,这个结构体虽然是公共的,但结构体中的字段默认是私有的,除非加上pub关键字。

在Rust里,绝大多数情况下如果某个东西没加pub,那就是私有的。(下文会讲到特例)

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

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(构造器中写的)。
    下面一行中,因为Breakfast这个结构体是公共的所以meal.toast可以直接被更改,这里是改为了Wheat。

eat_at_restaurant这个函数中写下meal.seasonal_fruit = String::from("buleberries");这一行会不会报错呢?答案是会的,因为结构体中的字段默认是私有的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下部分字段是私有的并不会影响它的使用。

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


http://www.kler.cn/a/454107.html

相关文章:

  • Redis基础知识分享(含5种数据类型介绍+增删改查操作)
  • c#自定义事件
  • 2023年软件产业报告|2023年我国软件业经济运行情况及未来发展趋势预期
  • 【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo
  • 数据库系统概论
  • ctfshow-web入门-文件包含(web82-web86)条件竞争实现session会话文件包含
  • Llama3.370B超越GPT-4o和Claude3.5 Sonnet
  • 从随机生成到深度学习:使用DCGAN和CycleGAN生成图像的实战教程
  • Android 开发中自定义Toast
  • Metricbeat安装教程——Linux——Metricbeat监控ES集群
  • 从安全角度看 SEH 和 VEH
  • 软件测试之Android-sdk环境搭建
  • 网络安全top国际会议
  • C#数学相关开发性能优化方法
  • [计算机网络]RIP协议
  • CMake 构建项目并整理头文件和库文件
  • 设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
  • ios按键精灵自动化的脚本教程:自动点赞功能的实现
  • 几个网络故障排除案例
  • 【mysql】MVCC及实现原理