Rust基礎05-初見結構體
阿新 • • 發佈:2022-03-27
初識struct
-
何為struct:
struct,即為結構體,是一種允許自定義的資料型別
其允許為一組相關聯的值命名並打包為有意義的組合
-
定義struct:
使用 struct 關鍵字,併為整個 struct 命名
在花括號中,為所有欄位(Field)定義名稱和型別
struct User { username:String. email:String, sign_in_count:u64, active:bool, };
-
例項化struct:
想要使用 struct,需要建立 struct 的例項:
- 為每個欄位指定具體值
- 無需按宣告的順序進行指定
struct User { username:String. email:String, sign_in_count:u64, active:bool, }; let user1 = User { email:String::from("[email protected]"), username:String::from("someusername123"), active:true, sign_in_count:1, };
-
取得 struct 中的某個值:
使用點標記法:
struct User { username:String. email:String, sign_in_count:u64, active:bool, }; let mut user1 = User { email:String::from("[email protected]"), username:String::from("someusername123"), active:true, sign_in_count:1, }; user1.email = String::from("[email protected]")
注意:一旦 struct 例項可變,那麼例項中-所有的欄位均可變
-
struct 作為函式的返回值:
fn build_user(email:String, username:String) -> User { User { email:email, username:username, active:true, sign_in_count:1, } }
欄位初始化簡寫:當欄位名與欄位值對應變數名相同時,就可使用欄位初始化簡寫的方式
fn build_user(email:String, username:String) -> User { User { email,//已簡寫 username,//已簡寫 active:true, sign_in_count:1, } }
-
struct 更新語法:
當想基於某個 struct 例項來建立一個新例項時,可以使用 struct 更新語法
見下例 main函式 user2 中使用了更新語法
struct User { username: String, email: String, sign_in_count: u64, active: bool, } fn main() { let user1 = User { email: String::from("[email protected]"), username: String::from("username555"), sign_in_count:1, active:true, }; let user2 = User { email: String::from("[email protected]"), username: String::from("anotherusername567"), ..user1 }; }
-
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, 0, 0); let origin = Point(0, 0, 0);
其中 black 和 origin 是不同的型別,是不同 tuple struct 的例項
-
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 裡也可以存放引用,但這需要使用生命週期