標籤:程式設計語言 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