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

【Rust自学】7.2. 路径(Path)Pt.1:相对路径、绝对路径与pub关键字

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

7.2.1. 路径的简介

在Rust里,如果想要找到模块里的某个东西,就必须知道并使用它的路径。Rust中的路径就跟文件系统里面的了路径是差不多的,与其他语言里的命名空间有点像。

路径一共有两种形式:

  • 绝对路径:从crate库开始,使用crate名或字面值crate(看下面的例子就明白了)
  • 相对路径:从当前模块开始,使用self(本身),super(上一级)或者当前模块的标识符

路径至少由一个标识符组成,标识符之间使用::连接

7.2.2. 路径的使用

看个例子(lib.rs):

mod front_of_house {
    mod hosting {
        fn add_to_waitlist() {}

        fn seat_at_table() {}
    }
}

pub fn eat_at_restaurant(){
	crate::front_of_house::hosting::add_to_waitlist();
	front_of_house::hosting::add_to_waitlist();
}

hostingfront_of_the_house的子module,hosting下还定义了两个函数add_to_waitlistseat_at_table

front_of_the_house的同一级中还声明了一个函数eat_at_restaurant,这个函数下就分别用绝对路径和相对路径调用了add_to_waitlist这个函数。

对于绝对路径,函数eat_at_restaurantadd_to_waitlist所在的front_of_the_house模块在同一个文件lib.rs里,也就是在同一个crate里(lib.rs的内容已经隐式地组成了crate这个模块,具体可以参考上一篇文章最后一部分)。所以说绝对路径就是从crate开始写起,逐级地写,用::分开每级的标识符:

crate::front_of_house::hosting::add_to_waitlist();

对于相对路径,由于函数eat_at_restaurantadd_to_waitlist所在的front_of_the_house模块在同一级,所以就可以直接从模块名起手写,依然是逐级地写,用::分开每级的标识符:

front_of_house::hosting::add_to_waitlist();

在实际项目中,使用绝对路径还是相对路径主要取决于你定义条目的代码(例子中的add_to_waitlist)和使用条目的代码(例子中的eat_at_restaurant)会不会一起移动而决定。如果这两部分一起移动,也就是两者的相对路径不会变,那么就使用相对路径;反之则需要用绝对路径。但大部分情况还是使用绝对路径,因为这样定义条目的代码和使用条目的代码就可以彼此独立地进行移动。

接下来我们运行一下代码:

error[E0603]:module `hosting` is private

不管是绝对路径调用还是相对路径调用都报了这个错误。这个错误的意思是hosting模块是私有的。

刚好借着这个报错讲一下私有边界这个概念

7.2.3. 私有边界(Privacy boundary)

模块的作用不仅是组织代码,还可以定义私有边界。如果想把函数或struct设为私有的就可以把它放到某个模块中,就像刚才那个例子中的函数一样,它就在hosting这个模块里。

Rust默认所有的条目(函数、方法、struct、enum、模块、常量等)都是私有的。而对于私有的条目来说,外部的代码就无法调用或者是依赖他们。Rust之所以这么规定是因为它希望这些内部细节默认隐藏来使程序员明确地知道修改哪些内部实现不会破话外部的代码。

Rust的私有边界还有规则:父级模块无法访问子模块中的私有条目,依然是为了隐藏实现细节;在子模块里可以使用所有祖先模块中的条目,因为子模块就是定义于父模块以及其他祖先模块的上下文中。打个比方:爸爸不能看儿子日记,而儿子可以用爸爸的钱。

想要公有就需要在定义模块时加上pub关键字。

7.2.4. pub关键字

mod关键字之前加上pub即可以把模块转为公有。在之前的代码例上稍作修改:

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
        
        fn seat_at_table() {}
    }
}

pub fn eat_at_restaurant(){
	crate::front_of_house::hosting::add_to_waitlist();
	front_of_house::hosting::add_to_waitlist();
}

注意:hosting这个模块和add_to_waitlist()这个函数的前面都需要加pub关键字

再进行编译,这下编译器没有报错。

有人可能会问:为什么front_of_house没有加pub是私有的但调用时没有报错呢?这是因为它是文件里的根级,而根级和根级之间是可以相互调用的,无论是私有的还是公有的。


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

相关文章:

  • 论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式
  • 找到字符串中所有字母异位词
  • LLM预训练recipe — 摘要版
  • 详细对比JS中XMLHttpRequest和fetch的使用
  • Kalilinux下MySQL的安装
  • Python vs PHP:哪种语言更适合网页抓取
  • Vue.js框架:在线教育系统的安全性与稳定性
  • k8s etcd 数据损坏处理方式
  • springboot使用自定义的线程池 完成 多线程执行网络请求,返回数据后,统一返回给前段
  • 计算机网络基础知识
  • vulnhub-matrix-breakout-2-morpheus
  • Rust : tokio中select!
  • 聊一聊 C#线程池 的线程动态注入
  • Flutter persistentFooterButtons控件详解
  • 【EI会议征稿】人工智能与遥感应用国际会议 (AIRSA 2025)
  • uniapp popup弹窗组件的自定义使用方法
  • Large Language Model based Multi-Agents: A Survey of Progress and Challenges
  • (补)算法刷题Day24: BM61 矩阵最长递增路径
  • 本地部署 LLaMA-Factory
  • 解决:excel鼠标滚动幅度太大如何调节?
  • (NIPS-2024)PISSA:大型语言模型的主奇异值和奇异向量适配
  • 社区二手物品交易小程序ssm+论文源码调试讲解
  • 如何通过HTTP API插入或更新Doc
  • Android Framework 目录下的 AV/Camera 定制常见问题及解决方法
  • Coding(Jenkinsfile)+ Docker 自动化部署 Springboot —— 图文细节和一些注意事项说明
  • 【NIFI】实现ORACLE->ORACLE数据同步