結構體

YouTube 上觀看本章內容: Part 1Part 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
    };
}

在具名結構體中,你也可以用逗號來分隔欄位。對於最後一個欄位,你可以加或不加逗號──這取決於你。SizeAndColourcolour 後面有一個逗號:

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 結構有 populationcapitalleader_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: populationcapital: capitalleader_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,
    };
}