結構體
YouTube 上觀看本章內容: Part 1 及 Part 2
有了結構體(struct),你可以建立自己的型別。在 Rust 中,你會無時無刻用著結構體,因為它們非常方便。結構體是用關鍵字 struct
建立的。結構體的名稱應該用大駝峰式命名法(UpperCamelCase,每個字首用大寫字母,不含空格)。如果你用全小寫的結構體,編譯器會告訴你。
結構體有三種類型。一種是"單元結構體"。單元的意思是"沒有任何東西"。對於一個單元結構體,你只需要寫名字和一個分號。
struct FileDirectory; fn main() {}
下一種是元組結構體(tuple struct),或者說是未具名結構體。之所以是"未具名",是因為你只需要寫型別,而不是欄位(field)名。元組結構體適合在你需要一個簡單的結構,並且不需要記住名字時。
struct Colour(u8, u8, u8); fn main() { let my_colour = Colour(50, 0, 50); // 從RGB (red, green, blue)做出顏色 println!("The second part of the colour is: {}", my_colour.1); }
印出 The second part of the colour is: 0
。
第三種類型是具名結構體。這可能是最常見的結構體。在這個結構體中,你在 {}
程式碼區塊中宣告欄位名和型別。請注意,在具名結構體後面不要寫分號,因為它後面是一整個程式碼區塊。
struct Colour(u8, u8, u8); // 宣告一樣的 Colour 元組結構體 struct SizeAndColour { size: u32, colour: Colour, // 並且我們把它放在我們的新具名結構體裡 } fn main() { let my_colour = Colour(50, 0, 50); let size_and_colour = SizeAndColour { size: 150, colour: my_colour }; }
在具名結構體中,你也可以用逗號來分隔欄位。對於最後一個欄位,你可以加或不加逗號──這取決於你。SizeAndColour
在 colour
後面有一個逗號:
struct Colour(u8, u8, u8); // 宣告一樣的 Colour 結構體 struct SizeAndColour { size: u32, colour: Colour, // 並且我們把它放在我們的新具名結構體裡 } fn main() {}
但你不需要它。但總是放一個逗號可能是個好主意,因為有時你會改變欄位的順序:
struct Colour(u8, u8, u8); // 宣告一樣的 Colour 結構體 struct SizeAndColour { size: u32, colour: Colour // 這裡沒有逗號 } fn main() {}
然後我們決定改變順序...
struct SizeAndColour { colour: Colour // ⚠️ Whoops! 現在這裡沒有逗號。 size: u32, } fn main() {}
但無論哪種方式都不是很重要,所以你可以選擇是否要使用逗號。
我們建立一個 Country
結構體來舉例說明。Country
結構有 population
、capital
和 leader_name
三個欄位。
struct Country { population: u32, capital: String, leader_name: String } fn main() { let population = 500_000; let capital = String::from("Elista"); let leader_name = String::from("Batu Khasikov"); let kalmykia = Country { population: population, capital: capital, leader_name: leader_name, }; }
你有沒有注意到,我們把同樣的東西寫了兩次?我們寫了 population: population
、capital: capital
和 leader_name: leader_name
。實際上,你不需要這樣做。如果欄位名和變數名相同,你就不用寫兩次。
struct Country { population: u32, capital: String, leader_name: String } fn main() { let population = 500_000; let capital = String::from("Elista"); let leader_name = String::from("Batu Khasikov"); let kalmykia = Country { population, capital, leader_name, }; }