網站首頁 編程語言 正文
包和crate
- 通過相關功能進行分組和劃分不同的功能代碼, 將代碼分割成多個模塊和多個文件組織代碼, 一個包包含 多個
crate
和一個可選的crate, Cargo 類似C++ 提供一個工作空間命名 類似JAVA中包空間。 - 避免重復造輪子, 其他代碼通過公關接口進行調用。
- 模塊系統: 包,Crates(模塊樹形結構,庫和二進制項目), 模塊, 路徑。
- *crate 是一個二進制項/ 庫, rust編譯以crate root源文件為起點,包中包含一個
Cargo.toml
描述如何構建crate.
$ cargo new my-project
? ? ?Created binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs
Cargo 遵循一個約定 src/main.rs是一個與包同名二進制crate的根,如果包中同時包含src/main.rs, src/lib.rs 表示擁有多個與包同名的crate, 每個src/bin 文件都會被編譯成獨立的庫
模塊控制作用域與私有性
模塊能夠將庫中代碼進行分組, 提供可讀性和重用性
use 引入外部依賴, pub公有關鍵字, as關鍵字 glob運算符。
// 一個包包含其他內置函數模塊的 front_of_house mod front_of_house { mod hosting { fn add_to_waitlist() {} fn seat_at_table() {} } mod serving { fn take_order() {} fn serve_order() {} fn take_payment() {} } } crate └── front_of_house ├── hosting │ ├── add_to_waitlist │ └── seat_at_table └── serving ├── take_order ├── serve_order └── take_payment
###模塊中路徑
- rust如何在一個模塊中找到一個項,路徑有兩種形式, 跟著一個
::
作為分割標識符 - 絕對路徑: 從crate根開始
- 相對路徑 : 以self, super
mod front_of_house { mod hosting { fn add_to_waitlist() {} } } pub fn eat_at_restaurant() { // 絕對路徑 crate::front_of_house::hosting::add_to_waitlist(); // 相對路徑 front_of_house::hosting::add_to_waitlist(); }
如上此代碼不能編譯 原因在于 hosting 在 mod的內部, 屬于私有的模塊 不能被外部調用 ,rust中默認所有項(函數、方法、結構體、枚舉、模塊和常量)都是私有的。
父模塊不能使用子模塊的所有項,但是子模塊可以,如果想要外部調用 必須的要增加 pub 關鍵字進行暴露
pub fn eat_at_restaurant() { // 絕對路徑 crate::front_of_house::hosting::add_to_waitlist(); // 相對路徑 front_of_house::hosting::add_to_waitlist(); }
use 進行模塊引入
mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} fn seat_at_table() {} } mod serving { fn take_order() {} fn serve_order() {} fn take_payment() {} } } use crate::front_of_house::hosting; use self::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist(); }
解決將兩個同類型引入同一個作用域 導致rust編譯錯誤問題 使用as 關鍵字解決此等問題
use std::fmt::Result; use std::io::Result as IoResult;
pub use 能夠讓其他人導入他們自己的作用域
pub use crate::front_of_house::hosting
使用外部包的話需要Cargo.toml 下面增加
rand = "0.8.3"
原文鏈接:https://blog.csdn.net/qq_27217017/article/details/123307706
相關推薦
- 2022-09-08 pytorch中Tensor.to(device)和model.to(device)的區別及說明_p
- 2022-04-28 C#操作進程的方法介紹_C#教程
- 2022-09-02 Python中的Numpy?面向數組編程常見操作_python
- 2023-02-09 React?Context原理深入理解源碼示例分析_React
- 2022-09-16 詳解C++?中?shared_ptr?weak_ptr_C 語言
- 2022-05-06 react-router-domV6版本的路由和嵌套路由寫法詳解_React
- 2023-12-16 IDEA中調用方法時,同步顯示方法的注釋信息
- 2022-08-01 C++簡單又好用的基本運算符重載_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支