Rust基礎(chǔ)學(xué)習(xí)-10-結(jié)構(gòu)體的方法

這篇博客來聊一下 結(jié)構(gòu)體的方法炎辨,本質(zhì)上就是為某個(gè)結(jié)構(gòu)體而定義的方法 (函數(shù))捕透。拿面向?qū)ο笳Z言來說,寫了一個(gè)類碴萧,還可能會(huì)在這個(gè)類里寫一些方法激率,基本上同樣的套路∥鹁觯或者說乒躺,定義的這些方法,是與這個(gè)結(jié)構(gòu)體有關(guān)的低缩。

不太嚴(yán)謹(jǐn)?shù)慕忉尲蚊埃@里所謂的方法,其實(shí)就是一個(gè)函數(shù)咆繁。

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

看下面的代碼

// 這里定義一個(gè)矩形的結(jié)構(gòu)體
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

// 這里的 impl xxx 是固定的讳推,xxx 就是你要為哪一個(gè)結(jié)構(gòu)體去定義一些方法
impl Rectangle {
    // 這是一個(gè)計(jì)算面積的方法
    fn area(&self) -> u32 {
        self.width * self.height
    }
    
    // 這是一個(gè)計(jì)算周長(zhǎng)的方法
    fn perimeter(&self) -> u32 {
        self.width * 2 + self.height * 2
    }
    
    // 這是一個(gè)計(jì)算能否包含另一個(gè)矩形的方法
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

!!! 注意看上面的代碼及 注釋

結(jié)構(gòu)體的方法 第一個(gè)參數(shù)總是 &self 表示定義好的結(jié)構(gòu)體 實(shí)例 自身

下面是使用這個(gè)結(jié)構(gòu)體

fn main() {
    let r1 = Rectangle {width: 128, height: 90};
    let r2 = Rectangle {width: 50, height: 30};
    
    println!("{:#?}", r1);
    println!("{:#?}", r2);
    
    // 調(diào)用結(jié)構(gòu)體的 area() 方法
    println!("r area: {}", r1.area());
    
    // 調(diào)用結(jié)構(gòu)體的 perimeter() 方法
    println!("r perimeter: {}", r1.perimeter());
    
    // 調(diào)用結(jié)構(gòu)體的 can_hold() 方法
    println!("r1 can hold r2: {}", r1.can_hold(&r2));
}

注意上面的代碼,我們打印結(jié)構(gòu)體實(shí)例的時(shí)候玩般,以前是用 {:?}银觅,而這次用的是 {:#?}。這是因?yàn)榛滴褂?{:#?} 能以更美觀的方式打印出這個(gè)結(jié)構(gòu)體的數(shù)據(jù)來

如果要定義可以修改的結(jié)構(gòu)體究驴,只要加上 mut 就行,看下面的代碼

fn main() {
    let mut r1 = Rectangle {width: 100, height: 50};
    println!("{:#?}", r1);
    
    // 修改了 r1 的 width
    r1.width = 1000;
    println!("{:#?}", r1);
}

關(guān)聯(lián)函數(shù)

impl 代碼塊中匀伏,定義一些不以 &self 作為參數(shù)的函數(shù)洒忧,這些函數(shù)被稱為 關(guān)聯(lián)函數(shù)。就是說够颠,這些函數(shù)熙侍,不針對(duì)某一個(gè)具體的結(jié)構(gòu)體實(shí)例,而是針對(duì)這個(gè)結(jié)構(gòu)體本身履磨。

直接看下面的代碼

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    // 創(chuàng)建一個(gè) 矩形 實(shí)例
    fn new(width: u32, height: u32) -> Rectangle {
        Rectangle {
            width,
            height,
        }
    }
    
    // 創(chuàng)建一個(gè) 正方形 實(shí)例
    fn new_square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

下面代碼是 使用 關(guān)聯(lián)函數(shù)

fn main() {
    let r1 = Rectangle::new(100, 80);
    let r2 = Rectangle::new_square(100);
    println!("{:#?}", r1);
    println!("{:#?}", r2);
}

對(duì)于一個(gè)結(jié)構(gòu)體方法的調(diào)用蛉抓,我們使用 r1.area() 這樣的形式。而對(duì)于 關(guān)聯(lián)函數(shù) 的調(diào)用剃诅,需要使用 :: 這個(gè)操作符巷送。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市综苔,隨后出現(xiàn)的幾起案子惩系,更是在濱河造成了極大的恐慌位岔,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堡牡,死亡現(xiàn)場(chǎng)離奇詭異抒抬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晤柄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門擦剑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芥颈,你說我怎么就攤上這事惠勒。” “怎么了爬坑?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵纠屋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我盾计,道長(zhǎng)售担,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任署辉,我火速辦了婚禮族铆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哭尝。我一直安慰自己哥攘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布材鹦。 她就那樣靜靜地躺著逝淹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侠姑。 梳的紋絲不亂的頭發(fā)上创橄,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音莽红,去河邊找鬼。 笑死邦邦,一個(gè)胖子當(dāng)著我的面吹牛安吁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燃辖,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼鬼店,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了黔龟?” 一聲冷哼從身側(cè)響起妇智,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤滥玷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后巍棱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惑畴,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年航徙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了如贷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡到踏,死狀恐怖杠袱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窝稿,我是刑警寧澤楣富,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站伴榔,受9級(jí)特大地震影響菩彬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜潮梯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一骗灶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秉馏,春花似錦耙旦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帆竹,卻和暖如春绕娘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栽连。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工险领, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秒紧。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓绢陌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親熔恢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脐湾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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