解析rust中的struct
定義struct
- 使用struct關(guān)鍵字,并為整個(gè)struct命名
- 在花括號內(nèi),為所有字段(field)定義名稱和類型
struct User{
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
實(shí)例化struct
- 想要使用struct,需要?jiǎng)?chuàng)建strut的實(shí)例
- 為每個(gè)字段知道具體值
- 無需按聲明的順序進(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);
}
字段初始化簡寫
當(dāng)字段名與字段值對應(yīng)變量名相同時(shí),就可以使用字段初始化簡寫的方式
fn build_user(email: String, username: String)-> User{
User{
email,
username,
active: true,
sign_in_count:1,
}
}
struct更新語法
當(dāng)你想基于某個(gè)struct實(shí)例來創(chuàng)建一個(gè)新實(shí)例的時(shí)候,可以使用struct更新語法
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 類型會(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
- 可定義類似tuple的struct,叫做tuple struct
- tuple struct 整體有個(gè)名,但里面的元素沒有名
- 適用:想給整個(gè)tuple起名,并且它不同于其它tuple,而且又不需要給每個(gè)元素
- 定義tuple struct:使用struct關(guān)鍵字,后邊是名字,以及里面元素的類型
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(沒有任何字段)
- 可以定義沒有任何的struct,叫做Unit-Like struct(因?yàn)榕c{},單元類型類似)
- 使用與需要在某個(gè)類型上失效某個(gè)trait,但是在里面有沒有想要存儲的數(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ù)類似:fn關(guān)鍵字、名稱、參數(shù)、返回值
- 方法與函數(shù)不同之處
- 方法是在struct(或enum、trait對象)的上下文中定義
- 第一個(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沒有->運(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)造器
- ::符號
- 關(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Rust語言編寫一個(gè)ChatGPT桌面應(yīng)用示例詳解
這篇文章主要介紹了如何用Rust編寫一個(gè)ChatGPT桌面應(yīng)用,文中有詳細(xì)的流程介紹,對大家的學(xué)習(xí)或工作有意一定的幫助,需要的朋友可以參考下2023-05-05
Rust生命周期之驗(yàn)證引用有效性與防止懸垂引用方式
本文介紹了Rust中生命周期注解的應(yīng)用,包括防止懸垂引用、在函數(shù)中使用泛型生命周期、生命周期省略規(guī)則、在結(jié)構(gòu)體中使用生命周期、靜態(tài)生命周期以及如何將生命周期與泛型和特質(zhì)約束結(jié)合,通過這些機(jī)制,Rust在編譯時(shí)就能捕獲內(nèi)存安全問題2025-02-02
Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解
這篇文章主要為大家介紹了Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
詳解Rust中三種循環(huán)(loop,while,for)的使用
我們常常需要重復(fù)執(zhí)行同一段代碼,針對這種場景,Rust?提供了多種循環(huán)(loop)工具。一個(gè)循環(huán)會(huì)執(zhí)行循環(huán)體中的代碼直到結(jié)尾,并緊接著回到開頭繼續(xù)執(zhí)行。而?Rust?提供了?3?種循環(huán):loop、while?和?for,下面逐一講解2022-09-09
Rust動(dòng)態(tài)調(diào)用字符串定義的Rhai函數(shù)方式
Rust中使用Rhai動(dòng)態(tài)調(diào)用字符串定義的函數(shù),通過eval_expression_with_scope實(shí)現(xiàn),但參數(shù)傳遞和函數(shù)名處理有局限性,使用FnCall功能更健壯,但更復(fù)雜,總結(jié)提供了更通用的方法,但需要處理更多錯(cuò)誤情況2025-02-02
Rust調(diào)用Windows API 如何獲取正在運(yùn)行的全部進(jìn)程信息
本文介紹了如何使用Rust調(diào)用WindowsAPI獲取正在運(yùn)行的全部進(jìn)程信息,通過引入winapi依賴并添加相應(yīng)的features,可以實(shí)現(xiàn)對不同API集的調(diào)用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-11-11

