網(wǎng)站首頁 編程語言 正文
前言
書接上文,本篇補充rust 組織管理中模塊的細節(jié)知識,比如模塊拆分。此外介紹use關鍵字的習慣用法,快速引用自定義模塊內(nèi)容或標準庫,以此優(yōu)化代碼書寫。
1、rust 中的use關鍵字
如果我說use
與C/C++中的include
或者是java、python中的import
用法類似,想必此時的你定是頭一歪,腦子里蹦出兩個字——拿捏。沒錯,看完本篇文章心里會更加敞亮,變得自信滿滿。
1.1、將模塊標識符引入當前作用域
- use 關鍵字能夠?qū)⒛K標識符引入當前作用域
- 但是謹記引入的時候也遵循
私有權限
的原則
例如:
mod front_of_house{ pub mod hosting{ pub fn add_to_waitlist(){} fn some_fun(){} } } use crate::front_of_house::hosting; pub fn eat_at_restaurant(){ hosting::add_to_waitlist(); hosting::add_to_waitlist(); hosting::some_fun(); }//這里并不能使用some_fun()函數(shù),是報錯內(nèi)容
我們可以看到
front_of_house
模塊中嵌套了一個公共模塊hosting
,但是我們知道公共模塊里的內(nèi)容也需要有pub
修飾才能被調(diào)用。因此沒有加pub關鍵字的第二個函數(shù)無法被調(diào)用,這就是遵循私有權限的體現(xiàn)。
1.2、use特點與習慣用法
我們習慣這樣使用 use:
1.不直接引入具體的函數(shù)或者方法
- 我們可以這樣引入具體函數(shù):use crate::front_of_house::hosting::add_to_waitlist;
- 當代碼比較多的時候,我們很難區(qū)分一個函數(shù)是本地自定義還是引用,因此不具體引用
2.引用函數(shù)或者方法最近的父模塊
- 不必引用最外層,以免代碼冗余
3.對于struct、enum 等函數(shù)以外的內(nèi)容需要指定到完整路徑(本身)
- 引入過后直接使用即可
例如:
use std::collections::HashMap; fn main() { let mut map=HashMap::new(); map.insert(1, 2); println!("{:?}",map); } //打印結(jié)果:{1,2}
如果一個類型在不同的模塊中都有,那么就要引入到父模塊(同名條目)
例如:
use std::fmt; use std::io; fn f1()->fmt::Result{} fn f2()->io ::Result{}
5.針對同名條目可以使用as
關鍵字來重命名類型
- 指定到完整路徑,給其中一個改名即可
例如:
use std::fmt::Result; use std::io::Result as IOResult; fn f1()-> Result<>{} fn f2()-> IOResult<>{}
1.3、使用pub use 重新導出名稱
- 使用 use 將路徑(名稱)導入到作用域后,該名稱在此作用域默認是私有的,外部無法訪問
- pub use:重導出
- 將條目引入作用域
- 該條目可以被外部代碼引入到自己的作用域
1.4、使用外部包(package)以及標準庫
- Cargo.toml 添加依賴的包
- 通過該網(wǎng)站自動下載資源:
https://crates.io/
- 但是默認網(wǎng)站是在國外,需要更換國內(nèi)鏡像
- 這些內(nèi)容在此專欄有文章講的比較詳細,不理解可以去翻閱一下
2.使用use
將特定條目引入作用域
3.標準庫(std)也被當作外部包
- 無需修改
Cargo.toml
來包含std
- 但是需要用 use 將 std 中的特定條目引入到當前作用域
1.5、使用嵌套路徑清理大量 use 語句
當使用同一個包或模塊下的多個條目時:
- 使用嵌套路徑在同一行內(nèi)將多個條目引入
- 路徑相同的部分
::
{路徑差異的部分}
例如:
use std::io; use std::cmp::Ordering; use std::{io,cmp::Ordering}; //前兩行可用最后一行替代
- 如果包含自身,需要使用
self
例如:
use std::io; use std::io::Write; use std::io::{self,Write}; //依然是最后一行可替換前兩行
1.6、通配符 *
- 使用
*
可以把路徑中所有的公共條目都引入到作用域 - 需要謹慎使用,作用場景:
- 測試:將所有被測試代碼引入到
tests
模塊(后續(xù)文章會有) - 有時被用于預導入(prelude)模塊
2、模塊內(nèi)容拆分
將模塊拆分為不同文件:
- 模塊定義時,如果模塊名后面是
;
而不是代碼塊: - Rust 會從與模塊同名的文件中加載內(nèi)容,例如:
此時的lib.rs
里不會報錯,編譯器看到mod front_of_house;
會在根目錄src
處找到front_of_house
文件夾里的hosting.rs
文件,使用pub use
將函數(shù)引入到當前作用域(必須嚴格按照圖示建立文件夾和文件)
- 模塊樹的結(jié)構(gòu)不會發(fā)生變化
隨著模塊逐漸變大,該技術讓你可以把模塊的內(nèi)容移動到其他文件中
到這里 rust 的組織管理算是徹底告一段落了,這塊內(nèi)容不多,但是理解起來還是要下點功夫的
原文鏈接:https://blog.csdn.net/m0_58618795/article/details/126910045
相關推薦
- 2023-03-13 Go語言中GORM存取數(shù)組/自定義類型數(shù)據(jù)_Golang
- 2022-05-25 創(chuàng)建指定大小文件,怎么創(chuàng)建?
- 2022-03-18 Linux系統(tǒng)配置(服務控制)詳細介紹_Linux
- 2022-11-07 .NET?實現(xiàn)啟動時重定向程序運行路徑及?Windows?服務運行模式部署的方法_實用技巧
- 2022-11-05 Android?Jetpack組件中LifeCycle作用詳細介紹_Android
- 2022-07-31 C++超詳細講解引用和指針_C 語言
- 2022-01-05 npm ERR! code ENOENT npm ERR! syscall open npm ERR
- 2023-06-05 關于C++的.cpp文件運行全過程_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支