解析rust中的struct
定義struct
- 使用struct關(guān)鍵字,并為整個(gè)struct命名
- 在花括號(hào)內(nèi),為所有字段(field)定義名稱(chēng)和類(lèi)型
struct User{ username: String, email: String, sign_in_count: u64, active: bool, }
實(shí)例化struct
- 想要使用struct,需要?jiǎng)?chuàng)建strut的實(shí)例
- 為每個(gè)字段知道具體值
- 無(wú)需按聲明的順序進(jìn)行指定
struct User{ username: String, email: String, sign_in_count: u64, active: bool, } fn main(){ let user1 = User{ username: String::from("xxxx"), email: String::from("xxxx@163.com"), active: true, sign_in_count:556, }; println!("username:{}", user1.username); println!("email:{}", user1.email); println!("active:{}", user1.active); println!("sign_in_count:{}", user1.sign_in_count); }
取得struct里面的某個(gè)值
使用點(diǎn)標(biāo)記法
struct User{ username: String, email: String, sign_in_count: u64, active: bool, } fn main(){ let mut user1 = User{ username: String::from("xxxx"), email: String::from("xxxx@163.com"), active: true, sign_in_count:556, }; // 注意 user1 必須是可變的 user1.username = String::from("hhhhhhh"); println!("username:{}", user1.username); println!("email:{}", user1.email); println!("active:{}", user1.active); println!("sign_in_count:{}", user1.sign_in_count); }
注意
一旦struct的實(shí)例是可變的,那么實(shí)例中的所有字段都是可以變的
struct作為函數(shù)的放回值
struct User{ username: String, email: String, sign_in_count: u64, active: bool, } fn build_user(email: String, username: String)-> User{ User{ email: email, username: username, active: true, sign_in_count:1, } } fn main(){ let email = String::from("xxxx@163.com"); let username = String::from("llllll"); let user1 = build_user(email, username); println!("username:{}", user1.username); println!("email:{}", user1.email); println!("active:{}", user1.active); println!("sign_in_count:{}", user1.sign_in_count); }
字段初始化簡(jiǎn)寫(xiě)
當(dāng)字段名與字段值對(duì)應(yīng)變量名相同時(shí),就可以使用字段初始化簡(jiǎn)寫(xiě)的方式
fn build_user(email: String, username: String)-> User{ User{ email, username, active: true, sign_in_count:1, } }
struct更新語(yǔ)法
當(dāng)你想基于某個(gè)struct實(shí)例來(lái)創(chuàng)建一個(gè)新實(shí)例的時(shí)候,可以使用struct更新語(yǔ)法
struct User{ username: String, email: String, sign_in_count: u64, active: bool, } fn build_user(email: String, username: String)-> User{ User{ email, username, active: true, sign_in_count:1, } } fn main(){ let email = String::from("xxxx@163.com"); let username = String::from("llllll"); let user1 = build_user(email, username); // user2 email 重新賦值 // user2 其他變量 使用 user1 的值 // String 類(lèi)型會(huì)被引用 從而失效 let user2 = User{ email: String::from("user2@163.com"), ..user1 }; // user1.username 被 user2.username 引用 從而失效 // println!("username:{}", user1.username); println!("username:{}", user2.username); println!("email:{}", user1.email); println!("email:{}", user2.email); println!("active:{}", user1.active); println!("sign_in_count:{}", user1.sign_in_count); }
tuple struct
- 可定義類(lèi)似tuple的struct,叫做tuple struct
- tuple struct 整體有個(gè)名,但里面的元素沒(méi)有名
- 適用:想給整個(gè)tuple起名,并且它不同于其它tuple,而且又不需要給每個(gè)元素
- 定義tuple struct:使用struct關(guān)鍵字,后邊是名字,以及里面元素的類(lèi)型
struct Color(i32, i32, i32); struct Point(i32, i32, i32); let black = Color(0, 2, 3); let origin = Point(3, 2, 3);
Unit-Like Struct(沒(méi)有任何字段)
- 可以定義沒(méi)有任何的struct,叫做Unit-Like struct(因?yàn)榕c{},單元類(lèi)型類(lèi)似)
- 使用與需要在某個(gè)類(lèi)型上失效某個(gè)trait,但是在里面有沒(méi)有想要存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)
struct數(shù)據(jù)的所有權(quán)
struct User{ username: String, email: String, sign_in_count: u64, active: bool, }
- 這里的字段使用了String而不是&str
- 改struct實(shí)例擁有其所有的數(shù)據(jù)
- 只有struct實(shí)例是有效的,那么里面的字段也是有效的
- struct里面也是存放引用,但是需要使用生命周期
什么事struct
- std::fmt::Display
- std::fmt::Debug
- #[derive(Debug)]
- {:?}
- {:#?}
#[derive(Debug)] struct Rectangle{ width: u32, length: u32, } fn main(){ let rect = Rectangle{ width: 22, length: 44, }; println!("{}", area(&rect)); println!("{:?}", rect); println!("{:#?}", rect); } fn area(rect: &Rectangle)-> u32{ rect.length * rect.width }
struct的方法
- 方法和函數(shù)類(lèi)似:fn關(guān)鍵字、名稱(chēng)、參數(shù)、返回值
- 方法與函數(shù)不同之處
- 方法是在struct(或enum、trait對(duì)象)的上下文中定義
- 第一個(gè)參數(shù)是self,表示方法被調(diào)用的struct實(shí)例
定義方法
#[derive(Debug)] struct Rectangle{ width: u32, length: u32, } impl Rectangle{ fn area(&self)-> u32{ self.width * self.length } } fn main(){ let rect = Rectangle{ width: 33, length: 44, }; println!("{}", rect.area()); println!("{:#?}", rect); }
- 在impl塊里定義方法
- 方法的第一個(gè)參數(shù)可以是&self,也可以獲得其所有權(quán)或可變借用。其他參數(shù)一樣。
- 更良好的代碼組織。
??????????????方法調(diào)用的運(yùn)算符
- C/C++:object->somthing()和(*object).something()一樣
- rust沒(méi)有->運(yùn)算符
- rust會(huì)自動(dòng)引用或解引用
- 在調(diào)用方法時(shí)就會(huì)發(fā)生這種行為
- 在調(diào)用方法時(shí),rust根據(jù)情況自動(dòng)添加&、&mut或*,以便object可以匹配方法的簽名。
- 下面兩行代碼效果相同
p1.distance(&p2); (&p1).distance(&p2);
關(guān)聯(lián)函數(shù)
- 可以在impl塊里定義不把self作為第一個(gè)參數(shù)的函數(shù),它們叫做關(guān)聯(lián)函數(shù)(不是方法)
String::from();
- 關(guān)聯(lián)函數(shù)通常用于構(gòu)造器
- ::符號(hào)
- 關(guān)聯(lián)函數(shù)
- 模塊創(chuàng)建的命名空間
#[derive(Debug)] struct Rectangle{ width: u32, length: u32, } impl Rectangle{ fn square(width: u32, length: u32)->Rectangle{ Rectangle{ width, length, } } } fn main(){ let rect = Rectangle::square(33, 11); println!("width:{}", rect.width); println!("length:{}", rect.length); println!("{:#?}", rect); }
多個(gè)impl塊
- 每個(gè)struct運(yùn)行擁有多個(gè)impl塊
到此這篇關(guān)于解析rust中的struct的文章就介紹到這了,更多相關(guān)rust struct內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
前端基于Rust實(shí)現(xiàn)的Wasm進(jìn)行圖片壓縮的技術(shù)文檔(實(shí)現(xiàn)方案)
在現(xiàn)代Web開(kāi)發(fā)中,利用Rust編寫(xiě)的圖片壓縮代碼可以編譯成WebAssembly(Wasm)模塊,Rust的內(nèi)存安全特性和Wasm的跨平臺(tái)能力,使得這種方案既高效又安全,對(duì)Rust?Wasm圖片壓縮實(shí)現(xiàn)方案感興趣的朋友一起看看吧2024-09-09Rust生命周期常見(jiàn)誤區(qū)(中英對(duì)照)全面指南
這篇文章主要WEIDJAI?介紹了Rust生命周期常見(jiàn)誤區(qū)(中英對(duì)照)的全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11vscode搭建rust開(kāi)發(fā)環(huán)境的圖文教程
Rust 是一種系統(tǒng)編程語(yǔ)言,它專(zhuān)注于內(nèi)存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開(kāi)發(fā)環(huán)境的圖文教程,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03Rust語(yǔ)言之Prometheus系統(tǒng)監(jiān)控工具包的使用詳解
Prometheus?是一個(gè)開(kāi)源的系統(tǒng)監(jiān)控和警報(bào)工具包,最初是由SoundCloud構(gòu)建的,隨著時(shí)間的發(fā)展,Prometheus已經(jīng)具有適用于各種使用場(chǎng)景的版本,為了開(kāi)發(fā)者方便開(kāi)發(fā),更是有各種語(yǔ)言版本的Prometheus的開(kāi)發(fā)工具包,本文主要介紹Rust版本的Prometheus開(kāi)發(fā)工具包2023-10-10