Rust語(yǔ)言學(xué)習(xí)小記(結(jié)構(gòu)體、枚舉)

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  //此處若返回()則沒有問題
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一周過去了,先來盤點(diǎn)下: 一、跑步:3次,10.4km。 很遺憾,20km的目標(biāo)沒有達(dá)到。 首先,客觀環(huán)境上,過去...
    非魚MM閱讀 335評(píng)論 0 0
  • 10月20日《丹東銀杏基地》出隊(duì)通知 【時(shí)間】早6點(diǎn)、世佳三毛店門前發(fā)車,提前10分鐘到達(dá)。 【領(lǐng)隊(duì)】樂園1305...
    雪_36f5閱讀 305評(píng)論 0 0
  • 發(fā)現(xiàn)“謝邀”似乎成了知乎榜上最有逼格的自夸標(biāo)榜詞。有的沒的,就得來上一句“謝邀”。旁人聽來總是牛逼哄哄的,兩個(gè)字便...
    Joan饅頭閱讀 153評(píng)論 0 0
  • 專情是好還是不好 每次我都以為你要走出來了 討厭這時(shí)候上前任3 讓你又心心念念 還要多久 你愿意給自己一個(gè)新的選擇
    喵的宇宙閱讀 202評(píng)論 0 0
  • 【公司】寧波慈星有限公司 【姓名】張穎 【組別】235期六項(xiàng)精進(jìn)【樂觀二組】 【日精進(jìn)打卡第91天】 【知~學(xué)習(xí)】...
    ying1026閱讀 178評(píng)論 0 0

友情鏈接更多精彩內(nèi)容