3. 結(jié)構(gòu)體
3.1 結(jié)構(gòu)提可變性:結(jié)構(gòu)體不能單獨(dú)聲明某個(gè)字段的可變性,只能聲明整個(gè)實(shí)例的可變性。
3.2 各種賦值語(yǔ)法
//聲明結(jié)構(gòu)體
struct User {
name : String,
email : String,
sign_in_count : u32,
}
//聲明元組結(jié)構(gòu)體
struct Color(i32, i32, i32);
struct MyUnit(); //沒有任何字段的單元結(jié)構(gòu)體
//基礎(chǔ)的賦值
let u1 = User{
name : String::from("name"),
email : String::from("test@mail.com"),
sign_in_count : 3,
};
//變量名與字段名相同時(shí)的賦值
let name = String::from("Hello world");
let email = String::from("mail");
let u2 = {
name, //此處會(huì)獲取name指向的String值的所有權(quán)
email, //此處會(huì)獲取email指向的String值的所有權(quán)
sign_in_count : 1,
};
//結(jié)構(gòu)體更新語(yǔ)法
let u3 = User {
name : String::from("my name"),
email : String::from("my mail"), //name和email字段需要所有權(quán),為使u2能正常使用,此處需重新生成這兩個(gè)字段
..u2
};
3.3 println!的debug結(jié)構(gòu)及利用宏派生trait
在println!宏中使用{:?}格式字符串可輸出入?yún)⒌膁ebug格式,該行為將調(diào)用入?yún)⑺鞠鹊腄ebug Trait的對(duì)應(yīng)功能。使結(jié)構(gòu)體便捷的實(shí)現(xiàn)Debug Trait的功能的方法是:在結(jié)構(gòu)體聲明前加上#[derive(Debug)]注解。
3.4 方法語(yǔ)法
方法聲明需放在impl語(yǔ)句塊中,且第一個(gè)參數(shù)必須為self。impl語(yǔ)句塊可以有多個(gè)。
struct User {
name : String,
}
impl User {
fn method(&self) -> String {
//do something
}
}
若impl語(yǔ)句塊中聲明的函數(shù),第一個(gè)參數(shù)不為self,它就是關(guān)聯(lián)函數(shù)。該函數(shù)可以根據(jù)結(jié)構(gòu)體名通過::來引用。
4. 枚舉
4.1 rust的枚舉中,不同的枚舉值可以攜帶不同類型及數(shù)量的數(shù)據(jù)
enum Message{
QUIT,
MOVE {x : i32, y : i32}, //匿名的結(jié)構(gòu)體
WRITE(String),
}
4.2 Rust中使用Option枚舉表示可能沒有的值
enum Option<T>{
Some(T),
None,
}
// 使用
let some = Some(1);
let none : Option<i32> = None; //使用None賦值時(shí)需要顯示申明變量類型
4.3 模式匹配
使用match表達(dá)式或者if let語(yǔ)句可以進(jìn)行模式匹配
match value {
pattern1 => result,
pattern2(variable) => {
//do something
result
},
_ => result, //match語(yǔ)句是又窮的,需要窮盡所有模式。如果只想捕獲某幾個(gè)模式而忽
//略其他的,則需將要捕獲的模式放在最前面,然后利用 _ 通配符指代
//所有的其他模式
};
if let pattern(variable) = value { //if let使用 = 來區(qū)分模式和值。=左邊是模式,
// 右邊是值
result
}else{
result2
}
4.3 match表達(dá)式重新開啟了一個(gè)作用域,因此,如果在match后直接使用變量,則變量的所有權(quán)會(huì)被移動(dòng)到新的作用域中,在之后的代碼中將無法使用
let m = Message::MESSAGE(String::from("Hello world"));
match m { //此處若使用&m,即m的引用,則不會(huì)有問題
Message::MESSAGE(message) => println!("{}", message),
_ => println!("nothing"),
}
match m { //編譯報(bào)錯(cuò),m已被移動(dòng)了
Message::MESSAGE(message) => println!("{}", message),
_ => ()
}
4.4 match表達(dá)式各分支的返回結(jié)果必須一致,否則會(huì)編譯報(bào)錯(cuò)
let m = Message::MESSAGE(String::from("Hello world"));
match m { //報(bào)錯(cuò),2與()類型不一致
Message::MESSAGE(message) => println!("{}", message),
_ => 2 //此處若返回()則沒有問題
}