Rust基礎(chǔ)學(xué)習-09-結(jié)構(gòu)體的定義

結(jié)構(gòu)體可以用于組織不同類型的數(shù)據(jù),和一些面向?qū)ο裾Z言中的 是很像的例书。

這篇博客包含以下內(nèi)容

  • 結(jié)構(gòu)體的定義
  • 通過一個函數(shù)艘策,創(chuàng)建并返回一個結(jié)構(gòu)體
  • 定義一個結(jié)構(gòu)體,但數(shù)據(jù)來自另外一個結(jié)構(gòu)體
  • 元祖結(jié)構(gòu)體

結(jié)構(gòu)體的定義

#[derive(Debug)]  // 加上這一句通熄,就可以使用 println!("{:?}", xxx); 打印
struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

結(jié)構(gòu)體以 struct 開頭,后面是我們自定義的這個結(jié)構(gòu)體類型的名字找都,里面每一個字段唇辨,以 字段名: 數(shù)據(jù)類型 的形式定義

結(jié)構(gòu)體開頭那個 #[derive(Debug)] 是為了打印而加的,也可以不加能耻,這個的意思會在后面章節(jié)學(xué)習到赏枚,現(xiàn)在我也不知道具體意思亡驰,反正加上就可以使用 {:?} 的形式打印。

下面這段代碼創(chuàng)建一個結(jié)構(gòu)體實例

fn main() {
    let mut user = User {
        username: String::from("someone"),
        email: String::from("someone@outlook.com"),
        sign_in_count: 1,
        active: false,
    };
    // 打印這個結(jié)構(gòu)體的內(nèi)容
    println!("{:?}", user);
    
    // 因為創(chuàng)建 user 的時候加了 mut饿幅,所以可以修改里面字段的內(nèi)容
    user.active = true;
    println!("Changed: {:?}", user);
}

通過一個函數(shù)凡辱,創(chuàng)建并返回一個結(jié)構(gòu)體

fn build_user(_username: String, _email: String) -> User {
    User {
        username: _username,
        email: _email,
        sign_in_count: 2,
        active: false,
    }
}

// 如果參數(shù)名和結(jié)構(gòu)體的字段名相同,則可以直接按下面的方式去賦值栗恩,
// 不需要再 aaa:bbb 這樣的形式透乾,并且順序也無所謂
fn build_user2(username: String, email: String) -> User {
    User {
        email,
        username,
        sign_in_count: 2,
        active: false,
    }
}

定義一個結(jié)構(gòu)體,但數(shù)據(jù)來自另外一個結(jié)構(gòu)體

#[derive(Debug)]
struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main() {
    let mut user = User {
        username: String::from("someone"),
        email: String::from("someone@outlook.com"),
        sign_in_count: 1,
        active: false,
    };
    println!("{:?}", user);
    
    let user2 = User {
        username: String::from("user2"),
        email: String::from("user2@outlook.com"),
        sign_in_count: user.sign_in_count,  // 使用 user 實例的數(shù)據(jù)
        active: user.active,  // 這個也使用 user 實例的數(shù)據(jù)
    };
    
    // 除了 username 和 email, 其他字段都使用 user 的值
    let user3 = User {
        username: String::from("user3"),
        email: String::from("user3@outlook.com"),
        ..user
    };
}

上面的代碼摄凡,使用其他結(jié)構(gòu)體數(shù)據(jù)续徽,創(chuàng)建新的結(jié)構(gòu)體時,我們使用的都是 簡單數(shù)據(jù)類型亲澡。如果使用 String 類型的字段钦扭,例如 username 或 email,則原有結(jié)構(gòu)體實例的數(shù)據(jù)床绪,會移動到新的結(jié)構(gòu)體實例客情。看下面的代碼癞己。

下面這段代碼編譯會出錯膀斋。

#[derive(Debug)]
struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main() {
    let mut user = User {
        username: String::from("someone"),
        email: String::from("someone@outlook.com"),
        sign_in_count: 1,
        active: false,
    };

    let user2 = User {
        ..user
    };

    // !!!! 這一句編譯會出錯,因為我們創(chuàng)建 user2 的時候痹雅,使用了所有 user的數(shù)據(jù)仰担,
    // 因為 username 和 email是String類型的,所以 所有權(quán) 會移動到 user2的對應(yīng)字段中
    // 所以這句就會報錯 !!!
    println!("{:?}", user.username);
}

如果要修復(fù)錯誤绩社,可以使用我們上一節(jié)學(xué)到的切片摔蓝,直接看下面的代碼

#[derive(Debug)]
struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main() {
    let mut user = User {
        username: String::from("someone"),
        email: String::from("someone@outlook.com"),
        sign_in_count: 1,
        active: false,
    };

    let user2 = User {
        username: String::from(&user.username[..]), // !!! 注意看這句
        email: String::from(&user.email[..]),       // !!! 還有這一句
        ..user
    };

    println!("{:?}", user.username);
    println!("{:?}", user);
    println!("{:?}", user2);
}

上面的代碼,在創(chuàng)建 user2 時愉耙,String類型的字段贮尉,我們通過切片,創(chuàng)建了新的 String 數(shù)據(jù)朴沿,所以沒有導(dǎo)致 所有權(quán) 轉(zhuǎn)移猜谚。

元祖結(jié)構(gòu)體

有一種結(jié)構(gòu)體,沒有具體的字段名赌渣,只有類型魏铅,這種結(jié)構(gòu)體,稱為 元祖結(jié)構(gòu)體 (tuple structs)坚芜÷倭悖看下面的代碼

#[derive(Debug)]
struct Color(i32, i32, i32, i32);

fn main() {
    let bg_color = Color(255, 0, 0, 255);
    println!("{:?}", bg_color);
    
    // 通過所引,訪問結(jié)構(gòu)體里的某個元素,與 元祖 的訪問方式一樣
    let r = bg_color.0;
    let g = bg_color.1;
    let b = bg_color.2;
    let a = bg_color.3;
}

這一節(jié)聊了一下結(jié)構(gòu)體的基本知識著隆,下一節(jié)將聊一下更多關(guān)于結(jié)構(gòu)體的東西湃窍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亡脸,一起剝皮案震驚了整個濱河市奶赠,隨后出現(xiàn)的幾起案子踩娘,更是在濱河造成了極大的恐慌娘荡,老刑警劉巖搔谴,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魁袜,死亡現(xiàn)場離奇詭異,居然都是意外死亡敦第,警方通過查閱死者的電腦和手機峰弹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芜果,“玉大人鞠呈,你說我怎么就攤上這事∮壹兀” “怎么了蚁吝?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舀射。 經(jīng)常有香客問我窘茁,道長,這世上最難降的妖魔是什么脆烟? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任山林,我火速辦了婚禮,結(jié)果婚禮上邢羔,老公的妹妹穿的比我還像新娘驼抹。我一直安慰自己,他們只是感情好张抄,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布砂蔽。 她就那樣靜靜地躺著,像睡著了一般署惯。 火紅的嫁衣襯著肌膚如雪左驾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天极谊,我揣著相機與錄音诡右,去河邊找鬼。 笑死轻猖,一個胖子當著我的面吹牛帆吻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咙边,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼猜煮,長吁一口氣:“原來是場噩夢啊……” “哼次员!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起王带,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤淑蔚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后愕撰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刹衫,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年搞挣,在試婚紗的時候發(fā)現(xiàn)自己被綠了带迟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡囱桨,死狀恐怖仓犬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝇摸,我是刑警寧澤婶肩,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站貌夕,受9級特大地震影響律歼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜啡专,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一险毁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧们童,春花似錦畔况、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至齐板,卻和暖如春吵瞻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背甘磨。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工橡羞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人济舆。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓卿泽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親滋觉。 傳聞我的和親對象是個殘疾皇子签夭,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容