Rust中文翻譯31

來源:互聯網
上載者:User

標籤:程式設計語言   rust   struct   

5.12 結構體


結構體是一個表示複雜資料類型的方式.例如,你可以計算二維座標,我們需要x和y的值:

let origin_x = 0;let origin_y = 0;
一個結構體就可以讓你將兩個值合并成一個獨立的值:
struct Point {    x: i32,    y: i32,}
fn main() {    let origin = Point {x: 0, y: 0}; // origin: Point    println!("The origin is at ({}, {})", origin.x, origin.y);}
這裡有很多代碼,我們一點點分析.我們聲明了一個結構體,使用struct關鍵字,然後給他命名.慣例上講,struct以一個大寫字母開頭使用camel格式:PointInSpace,而不是Point_In_Space.
我們可以建立一個結構體的樣本,通過let,但是我們使用key: value的方式來給每一個成員變數賦值.賦值的順序不必和聲明的順序一樣.
最後,因為成員變數都有名字,我們可以用.來訪問他們:origin.x.結構體中的值預設都是不可變的,就像其他綁定一樣.使用mut來讓他們可變:
struct Point {    x: i32,    y: i32,}
fn main() {    let mut origin = Point {x: 0, y: 0};     point.x = 5;    println!("The point is at ({}, {})", origin.x, origin.y);}
這會列印出 The point is at (5, 0).
Rust在語言層級上不支援成員變數可變,所以你不能這樣寫:
 struct Point {    mut x: i32,    y: i32,}
可變性是綁定的特性,而不是結構體自身.如果你使用成員變數級的可變性,首先看起來很怪,但是它極大簡化了問題.你甚至可以把可變性限定在一段時間內:
struct Point {
     x: i32,
     y: i32,
}
fn main() {
     let mut point = Point { x: 0, y: 0 };
     point.x = 5;
     let point = point; // 這個新的綁定不能修改了
     point.y = 6; // 這會出錯
}
5.12.1 更新文法
一個結構體可以包含..來代表你想使用一遝結構體的拷貝,例如:
struct Point3d {    x: i32,    y: i32,    z: i32,}
let mut point = Point3d{x:0, y:0, z:0};point = Point3d {y:1, .. point};
這樣會把y變成新的值,保留了原有的x和z的值.你也不必使用相同的結構體,你可以試用這個文法來建立新的結構體,它會拷貝你沒有明確指定的值:let origin = Point3d { x: 0, y: 0, z: 0 };
let point = Point3d { z: 1, x: 2, .. origin };
5.12.2 元組結構體(tuple structs)
Rust有一個資料類型看起來像是元組和結構體的結合體,稱為元組結構體.元組結構體有一個名字,但是它的成員沒有名字:struct Color(i32, i32, i32);struct Point(i32, i32, i32);
這兩個是不一樣的,儘管他們的值都一樣:let black = Color(0, 0, 0);let origin= Point(0, 0, 0);
使用結構體總是比使用元組結構體好.我們會這樣寫:
struct Color {
     red: i32,
     blue: i32,
     green: i32,
}
struct Point {
     x: i32,
     y: i32,
     z: i32,
}
我們現在有了確切的名字,而不是位置.好的名字很重要,通過結構體,我們可以有明確的名字.然而,有一個情境元組結構體很有用,那就是元組結構體只有一個元素.我們稱為"新類型"模式,因為它可以讓你建立一個新類型,區別於它包含的類型並且表達出它自己的語義:
struct Inches(i32);
let length = Inches(10);let Inches(integer_length) = length;println!("length is {} inches", integer_length);
正如你看到的,你可以展開內部整型,通過解構let,就像一個平常的元組.此例中,讓let Inches(integer_length)的integer_length賦值為10.
5.12.3 單元結構體
你可以頂一個一個沒有成員的結構體:struct Electron;
這種沒有成員的結構體稱為"單元",因為它只有一個空的元組,().像一個元組結構體一樣,它定義了一個新類型.這很少用,但是和其他特性一起他可以很有用.例如,一個庫會回要求你建立一個結構體來實現一個特性(trait)來處理事件.如果你沒有任何資料需要存入結構體,你可以建立一個單元結構體.

Rust中文翻譯31

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.