網(wǎng)站首頁 編程語言 正文
Defining and Instanting 定義與實(shí)例化
使用struct
關(guān)鍵字以定義結(jié)構(gòu)體。
struct User { id: u64, name: String, email: String, active: bool, }
使用let
語句聲明結(jié)構(gòu)體的實(shí)例,使用mut
指定可變性(必須全部可變或不可變,沒有部分可變)
let user1 = User { id: 1u64, name: String::from("Zheng"), email: String::from("888888@outlook.com"), active: true, };
使用.
指定結(jié)構(gòu)體成員,如user1.name
如果參數(shù)或變量與字段名同名,可以使用簡化寫法初始化變量
fn new_user(id: u64, name: String, email: String) -> User { User { id, name, email, active: true } }
使用結(jié)構(gòu)體更新語法,可以基于已有實(shí)例的字段創(chuàng)建新實(shí)例
let user3 = User { id: 3u64, ..user2 };
使用..[instant_name]
語法,剩余字段將使用user2
的字段
Attention: 結(jié)構(gòu)體更新等同于變量賦值,將發(fā)生value move,源變量可能導(dǎo)致不可用
let user3 = User { id: 3u64, ..user2 }; println!("{:#?}", user3); println!("user2: {:p}; user3: {:p}", &user2, &user3);
以上代碼將會產(chǎn)生錯誤:borrow of a partially moved value
。這是由于user2
的部分變量(字符串String)被賦值給了user3
,導(dǎo)致所有權(quán)發(fā)生轉(zhuǎn)移,結(jié)構(gòu)體整體(不包括未發(fā)生value move的字段)將不再可用。
使用元組結(jié)構(gòu)體可定義匿名字段
struct Color(i32, i32, i32); struct Point(i32, i32, i32);
注意,不同名的相同結(jié)構(gòu)元組結(jié)構(gòu)體將視為不同的類型,無法相互轉(zhuǎn)換
使用空結(jié)構(gòu)體,只實(shí)現(xiàn)trait,不需要存儲任何數(shù)據(jù)時可以使用。
結(jié)構(gòu)體數(shù)據(jù)的所有權(quán):當(dāng)一個結(jié)構(gòu)體擁有其全部數(shù)據(jù)的所有權(quán),則只要結(jié)構(gòu)體有效,其數(shù)據(jù)就有效。如果存在對其他數(shù)據(jù)的引用,則需要使用生命周期支持。
Derived Traits派生trait
派生trait
,指通過derive
注解 derive attribute
來派生的trait
,可以為自定義類型添加許多功能。關(guān)于派生trait列表,詳見附錄C
這里使用Debug trait
展示自定義結(jié)構(gòu)體的成員信息。
#[derive(Debug)] struct User { id: u64, name: String, email: String, active: bool, } fn main() { let user1 = User { id: 1u64, name: String::from("Zheng"), email: String::from("888888@outlook.com"), active: true, }; println!("{:#?}", user1); }
- 以上代碼會顯示
user1
的全部字段信息 - 也可以使用
{:?}
,單行輸出 - 實(shí)際上,它調(diào)用了
std::fmt::Display
,這被包含在派生trait中。
Method 方法
方法是定義在結(jié)構(gòu)體(或枚舉類型enum
,trait
對象)的上下文中的類似函數(shù)的過程,第一個參數(shù)是self,用于指代調(diào)用方法的結(jié)構(gòu)體實(shí)例。
Define
需要在impl
塊中定義方法,
#[derive(Debug)] struct Rectangle { width: u32, height: u32, } impl Rectangle { fn area(&self) -> u32 { self.width * self.height } } fn main() { let rect1 = Rectangle { width: 30, height: 20, }; println!("Size of {:?} is {}", rect1, rect1.area()); }
-
self
參數(shù)自動擁有impl
的結(jié)構(gòu)體類型,不需要另行指定 -
self
參數(shù)同樣擁有可變引用和直接獲取所有權(quán) - 除了方法必須在
impl
塊中,以及第一個參數(shù)名必須為self以外,其余與函數(shù)相同 - 可以使用多個
impl
塊來定義方法、關(guān)聯(lián)函數(shù),在泛型和trait中有應(yīng)用價值
自動引用與解引用
在方法調(diào)用中,Rust支持自動引用與解引用,使調(diào)用者匹配方法的簽名,如添加& &mut *
等。
Associated function 關(guān)聯(lián)函數(shù)
之前已經(jīng)提到過,還有不需要接收實(shí)例參數(shù)的關(guān)聯(lián)函數(shù)。因?yàn)槠洳蛔鲇糜谀硞€結(jié)構(gòu)體實(shí)例,所以稱其為函數(shù)。使用::
來使用關(guān)聯(lián)函數(shù)。
原文鏈接:https://blog.csdn.net/Zheng__Huang/article/details/127160284
相關(guān)推薦
- 2022-09-17 C/C++?控制臺等待指令解析_C 語言
- 2022-06-06 ASP.NET的Core?AD域登錄過程示例_ASP.NET
- 2022-03-08 C++中的對象初始化操作代碼_C 語言
- 2022-01-27 SpringBoot成功啟動后自動關(guān)閉
- 2021-12-25 常用時間處理方法:時間戳和格式化時間之間轉(zhuǎn)換;時間比大小
- 2023-01-09 python自動化測試中裝飾器@ddt與@data源碼深入解析_python
- 2022-10-13 redux持久化之redux-persist結(jié)合immutable使用問題_React
- 2022-12-09 Flask自定義序列化超詳細(xì)講解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支