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

你可能注意到null類型不在此列。他比較特殊貌笨,typeof對(duì)它的處理存在問(wèn)題:typeof null === "object"返回真,但是正確的結(jié)果應(yīng)該是"null"的,這個(gè)JavaScript內(nèi)部的bug由來(lái)已久——已經(jīng)存在了20多年心包,對(duì)于這個(gè)特性,因?yàn)闋砍兜教嗟膚eb系統(tǒng)缨恒,“修復(fù)”它會(huì)產(chǎn)生更過(guò)的bug谴咸,令太多的系統(tǒng)短時(shí)間內(nèi)無(wú)法工作。

結(jié)構(gòu)體是一個(gè)創(chuàng)建更復(fù)雜數(shù)據(jù)類型的方法骗露。普通結(jié)構(gòu)體的定義無(wú)需在末尾使用“岭佳;”,使用結(jié)構(gòu)體來(lái)定義一個(gè)變量應(yīng)該使用下面這樣的形式:結(jié)構(gòu)體名{字段名:值}萧锉,為字段賦值的順序不需要和聲明時(shí)保持一致珊随。結(jié)構(gòu)體變量可以使用.字段名來(lái)訪問(wèn)那個(gè)字段名所對(duì)應(yīng)的值。

fn main(){
  let origin:Point = Point{x: 0, y: 0};
  println!("{}", origin.x);//0
  println!("{}", origin.y);//0
}
struct Point{
  x: i32,
  y: i32
}

1.結(jié)構(gòu)體不支持字段可變性

mut關(guān)鍵字是用來(lái)修飾借用以及綁定的柿隙。目前為止叶洞,rust在語(yǔ)言級(jí)別上還不支持字段可變性,所以如果你想像下面這樣寫(xiě)的話那么會(huì)報(bào)錯(cuò)禀崖。

struct Foo{
  mut x: i32//語(yǔ)法錯(cuò)誤
}

盡管不支持字段可變性衩辟,但是rust可以通過(guò)其他詭異的方法來(lái)使得字段的值得到改變。如下所示:

fn main(){
  let mut point:Point = Point{x: 1,y: 2};
  point.x = 2;
  println!("{}", point.x);
}
struct Point{
  x: i32,
  y: i32
}

上面的這個(gè)方法:我們明明是定義了一個(gè)可變的綁定波附,然而到最后我們卻能夠改變的結(jié)構(gòu)體變量的字段的值艺晴,要知道這之間是不存在什么邏輯之間的因果關(guān)系的,對(duì)于近乎完美的rust來(lái)說(shuō)這無(wú)疑是一點(diǎn)不足掸屡。而且要注意的是如果我們的的結(jié)構(gòu)體變量自身并不是一個(gè)可變的綁定的話封寞,那么修改字段的值將會(huì)報(bào)錯(cuò)。
盡管如此仅财,但是由于mut可以修飾借用狈究,所以結(jié)構(gòu)體中的字段的值也可以是一個(gè)可變的借用。這個(gè)時(shí)候可以達(dá)到間接修改字段的值的問(wèn)題盏求。如下所示:

fn main(){
  let num:&mut i32 = &mut 9;
  let foo:Foo = Foo{n: num};
  *foo.n = 99;
  println!("{}", *foo.n);//99
}
struct Foo<'a>{
  n: &'a mut i32
}

2.更新語(yǔ)法

如果我們?cè)跇?gòu)造同一個(gè)結(jié)構(gòu)體的另一個(gè)對(duì)象的時(shí)候希望能夠利用這個(gè)結(jié)構(gòu)體先前所構(gòu)造出來(lái)的對(duì)象的某些字段抖锥,那么可以使用更新語(yǔ)法:在早前的結(jié)構(gòu)體變量前面加上..

下面可以看一個(gè)例子:

fn main(){
  let point:Point = Point{x: 0, y: 1, z: 0};
  let origin:Point = Point{y: 0, ..point};
  println!("{} {} {}", origin.x, origin.y, origin.z);//0 0 0
}
struct Point{
  x: i32,
  y: i32,
  z: i32
}
impl Point{
  fn get_x(&self) -> i32{self.x}
  fn get_y(&self) -> i32{self.y}
  fn get_z(&self) -> i32{self.z}
}

需要注意的問(wèn)題亿眠,更新語(yǔ)法必須用在同一個(gè)類型的結(jié)構(gòu)體上,比如說(shuō)下面的這個(gè)例子就是錯(cuò)誤的:

//error[E0308]: mismatched types
fn main(){
  let point:Point = Point{x: 1, y: 1, z: 1};
  let color:RGB = RGB{x: 0, ..point}; //expected struct `RGB`, found struct `Point`
}
struct Point{
  x: i32,
  y: i32,
  z: i32
}
impl Point{
  fn get_x(&self) -> i32{self.x}
  fn get_y(&self) -> i32{self.y}
  fn get_z(&self) -> i32{self.z}
}
struct RGB{
  x: i32,
  y: i32,
  z: i32
}

3.元組結(jié)構(gòu)體

Rust中有一個(gè)數(shù)據(jù)類型的表示方法很像元組和結(jié)構(gòu)體的混合體宁改,正由于這個(gè)特點(diǎn)我們叫他為元組結(jié)構(gòu)體缕探。元組結(jié)構(gòu)體的表示方法如下所示:struct 元組結(jié)構(gòu)體名();注意這里必須使用;對(duì)于普通的結(jié)構(gòu)體來(lái)說(shuō)我們并不需要使用 ;來(lái)結(jié)尾还蹲,但是對(duì)于元組結(jié)構(gòu)體來(lái)說(shuō)爹耗,我們必須使用;來(lái)結(jié)尾,而且對(duì)于元組結(jié)構(gòu)體來(lái)說(shuō)它不需要字段名谜喊,但是需要字段的數(shù)據(jù)類型潭兽。下面舉一個(gè)例子:

fn main(){
  struct Color(i32, i32, i32);
  let color:Color = Color(255, 255, 255);
  println!("{} {} {}", color.0, color.1, color.2);//255 255 255
  let Color(mut r, mut g, mut b) = color;
  println!("{} {} {}", r, g, b);//255 255 255
  r = 0;
  println!("{} {}", r, color.0);//0 255
}

從 上面的例子我們可以看出:元組結(jié)構(gòu)體可以像元組一樣使用“.位置”來(lái)得到那個(gè)位置處的值,同時(shí)也可以let解構(gòu)來(lái)獲得每個(gè)項(xiàng)的值斗遏,同時(shí)利用let解構(gòu)的方法需要注意山卦。

4.類單元結(jié)構(gòu)體

類單元結(jié)構(gòu)體即是在結(jié)構(gòu)體中沒(méi)有使用任何字段。至于類單元結(jié)構(gòu)體有什么作用的話目前也還不清楚诵次。

fn main(){
  struct EmptyStruct{};//定義類單元結(jié)構(gòu)體的方法一
  struct EmptyStruct2;//定義類單元結(jié)構(gòu)體的方法二
  let empty1 = EmptyStruct{};//必須使用{}
  let empty2 = EmptyStruct2;//不需要使用{}
  //Error: let empty3 = EmptyStruct;
}

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末账蓉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逾一,更是在濱河造成了極大的恐慌铸本,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遵堵,死亡現(xiàn)場(chǎng)離奇詭異箱玷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)陌宿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)锡足,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人壳坪,你說(shuō)我怎么就攤上這事舶得。” “怎么了爽蝴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵沐批,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我霜瘪,道長(zhǎng),這世上最難降的妖魔是什么惧磺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任颖对,我火速辦了婚禮,結(jié)果婚禮上磨隘,老公的妹妹穿的比我還像新娘缤底。我一直安慰自己顾患,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布个唧。 她就那樣靜靜地躺著江解,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徙歼。 梳的紋絲不亂的頭發(fā)上犁河,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音魄梯,去河邊找鬼桨螺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酿秸,可吹牛的內(nèi)容都是我干的灭翔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辣苏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肝箱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起稀蟋,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤煌张,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后糊治,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體唱矛,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年井辜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绎谦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粥脚,死狀恐怖窃肠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刷允,我是刑警寧澤冤留,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站树灶,受9級(jí)特大地震影響纤怒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜天通,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一泊窘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦烘豹、人聲如沸瓜贾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)祭芦。三九已至,卻和暖如春憔鬼,著一層夾襖步出監(jiān)牢的瞬間龟劲,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工逊彭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咸灿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓侮叮,卻偏偏與公主長(zhǎng)得像避矢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子囊榜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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