解析rust中的struct
更新時間:2022年10月08日 11:55:32 作者:fan_music
自定義的數據類型,為相關聯的值命名,打包成有意義的組合,類似python的dict,但是賦值的時候可以不按順序,本文給大家介紹下rust中的struct知識,感興趣的朋友一起看看吧
定義struct
- 使用struct關鍵字,并為整個struct命名
- 在花括號內,為所有字段(field)定義名稱和類型
struct User{
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
實例化struct
- 想要使用struct,需要創(chuàng)建strut的實例
- 為每個字段知道具體值
- 無需按聲明的順序進行指定
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里面的某個值
使用點標記法
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的實例是可變的,那么實例中的所有字段都是可以變的
struct作為函數的放回值
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);
}
字段初始化簡寫
當字段名與字段值對應變量名相同時,就可以使用字段初始化簡寫的方式
fn build_user(email: String, username: String)-> User{
User{
email,
username,
active: true,
sign_in_count:1,
}
}
struct更新語法
當你想基于某個struct實例來創(chuàng)建一個新實例的時候,可以使用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 類型會被引用 從而失效
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 整體有個名,但里面的元素沒有名
- 適用:想給整個tuple起名,并且它不同于其它tuple,而且又不需要給每個元素
- 定義tuple struct:使用struct關鍵字,后邊是名字,以及里面元素的類型
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(因為與{},單元類型類似)
- 使用與需要在某個類型上失效某個trait,但是在里面有沒有想要存儲的數據結構
struct數據的所有權
struct User{
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
- 這里的字段使用了String而不是&str
- 改struct實例擁有其所有的數據
- 只有struct實例是有效的,那么里面的字段也是有效的
- 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的方法
- 方法和函數類似:fn關鍵字、名稱、參數、返回值
- 方法與函數不同之處
- 方法是在struct(或enum、trait對象)的上下文中定義
- 第一個參數是self,表示方法被調用的struct實例
定義方法
#[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塊里定義方法
- 方法的第一個參數可以是&self,也可以獲得其所有權或可變借用。其他參數一樣。
- 更良好的代碼組織。
??????????????方法調用的運算符
- C/C++:object->somthing()和(*object).something()一樣
- rust沒有->運算符
- rust會自動引用或解引用
- 在調用方法時就會發(fā)生這種行為
- 在調用方法時,rust根據情況自動添加&、&mut或*,以便object可以匹配方法的簽名。
- 下面兩行代碼效果相同
p1.distance(&p2); (&p1).distance(&p2);
關聯函數
- 可以在impl塊里定義不把self作為第一個參數的函數,它們叫做關聯函數(不是方法)
String::from();
- 關聯函數通常用于構造器
- ::符號
- 關聯函數
- 模塊創(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);
}
多個impl塊
- 每個struct運行擁有多個impl塊
到此這篇關于解析rust中的struct的文章就介紹到這了,更多相關rust struct內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
前端基于Rust實現的Wasm進行圖片壓縮的技術文檔(實現方案)
在現代Web開發(fā)中,利用Rust編寫的圖片壓縮代碼可以編譯成WebAssembly(Wasm)模塊,Rust的內存安全特性和Wasm的跨平臺能力,使得這種方案既高效又安全,對Rust?Wasm圖片壓縮實現方案感興趣的朋友一起看看吧2024-09-09
vscode搭建rust開發(fā)環(huán)境的圖文教程
Rust 是一種系統(tǒng)編程語言,它專注于內存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開發(fā)環(huán)境的圖文教程,具有一定的參考價值,感興趣的可以了解一下2024-03-03
Rust語言之Prometheus系統(tǒng)監(jiān)控工具包的使用詳解
Prometheus?是一個開源的系統(tǒng)監(jiān)控和警報工具包,最初是由SoundCloud構建的,隨著時間的發(fā)展,Prometheus已經具有適用于各種使用場景的版本,為了開發(fā)者方便開發(fā),更是有各種語言版本的Prometheus的開發(fā)工具包,本文主要介紹Rust版本的Prometheus開發(fā)工具包2023-10-10

