復合數據類型可以在其他類型的基礎上形成更復雜的組合關系。
本章介紹tuple、struct、enum等幾種復合數據類型。數組留到第6章介紹。 2.3.1 tuple
tuple指的是“元組”類型,它通過圓括號包含一組表達式構成。tuple內的元素沒 有名字。tuple是把幾個類型組合到一起的最簡單的方式。比如:
let a = (1i32, false); // 元組中包含兩個元素,第一個是i32類型,第二個是bool類型
let b = (“a”, (1i32, 2i32)); // 元組中包含兩個元素,第二個元素本身也是元組,它又包含了兩個元素
如果元組中只包含一個元素,應該在后面添加一個逗號,以區分括號表達式和
元組:
let a = (0,); // a是一個元組,它有一個元素
let b = (0); // b是一個括號表達式,它是i32類型
訪問元組內部元素有兩種方法,一種是“模式匹配”(pattern destructuring),另 外一種是“數字索引”:
let p = (1i32, 2i32);
let (a, b) = p;
let x = p.0;
let y = p.1;
println!(“{} {} {} {}”, a, b, x, y);
在第7章中會對“模式匹配”做詳細解釋。 元組內部也可以一個元素都沒有。這個類型單獨有一個名字,叫unit(單元類
型):
let empty : () = ();
可以說,unit類型是Rust中最簡單的類型之一,也是占用空間最小的類型之 一。空元組和空結構體struct Foo;一樣,都是占用0內存空間。
fn main() {
println!(“size of i8 {}” , std::mem::size_of::());
println!(“size of char {}” , std::mem::size_of::());
println!(“size of ‘()’ {}” , std::mem::size_of::<()>());
}
上面的程序中,std::mem::size_of函數可以計算一個類型所占用的內存空 間。可以看到,i8類型占用1 byte,char類型占用4 bytes,空元組占用0 byte。
與C++中的空類型不同,Rust中存在實打實的0大小的類型。在C++標準中,有
明確的規定,是這么說的:
Complete objects and member subobjects of class type shall have nonzero size.
class Empty {};
Empty emp;
assert(sizeof(emp) != 0);