1. 程式人生 > 其它 >Rust基礎05-初見結構體

Rust基礎05-初見結構體

初識struct

  • 何為struct:

    struct,即為結構體,是一種允許自定義的資料型別

    其允許為一組相關聯的值命名並打包為有意義的組合

  • 定義struct:

    使用 struct 關鍵字,併為整個 struct 命名

    在花括號中,為所有欄位(Field)定義名稱和型別

    struct User {
        username:String.
        email:String,
        sign_in_count:u64,
        active:bool,
    };
    
  • 例項化struct:

    想要使用 struct,需要建立 struct 的例項:

    • 為每個欄位指定具體值
    • 無需按宣告的順序進行指定
    struct User {
        username:String.
        email:String,
        sign_in_count:u64,
        active:bool,
    };
    
    let user1 = User {
        email:String::from("[email protected]"),
        username:String::from("someusername123"),
        active:true,
        sign_in_count:1,
    };
    
  • 取得 struct 中的某個值:

    使用點標記法:

    struct User {
        username:String.
        email:String,
        sign_in_count:u64,
        active:bool,
    };
    
    let mut user1 = User {
        email:String::from("[email protected]"),
        username:String::from("someusername123"),
        active:true,
        sign_in_count:1,
    };
    
    user1.email = String::from("[email protected]")
    

    注意:一旦 struct 例項可變,那麼例項中-所有的欄位均可變

  • struct 作為函式的返回值:

    fn build_user(email:String, username:String) -> User {
        User {
            email:email,
            username:username,
            active:true,
            sign_in_count:1,
        }
    }
    

    欄位初始化簡寫:當欄位名與欄位值對應變數名相同時,就可使用欄位初始化簡寫的方式

    fn build_user(email:String, username:String) -> User {
        User {
            email,//已簡寫
            username,//已簡寫
            active:true,
            sign_in_count:1,
        }
    }
    
  • struct 更新語法:

    當想基於某個 struct 例項來建立一個新例項時,可以使用 struct 更新語法

    見下例 main函式 user2 中使用了更新語法

    struct User {
        username: String,
        email: String,
        sign_in_count: u64,
        active: bool,
    }
    
    fn main() {
        let user1 = User {
            email: String::from("[email protected]"),
            username: String::from("username555"),
            sign_in_count:1,
            active:true,
        };
    
        let user2 = User {
            email: String::from("[email protected]"),
            username: String::from("anotherusername567"),
            ..user1
        };
    }
    
  • Tuple struct:

    可定義類似 tuple 的 struct,叫做 tuple struct

    1. Tuple struct 整體有名,內部元素無名
    2. 適用於想給整個 Tuple 起名,並讓它不同於其他 tuple,而且不需要給每個元素起名

    定義 tuple struct:

    使用 struct 關鍵字,後面為名字,以及內部元素的型別

    struct Color(i32, i32, i32);
    struct Point(i32, i32, i32);
    let black = Color(0, 0, 0);
    let origin = Point(0, 0, 0);
    

    其中 black 和 origin 是不同的型別,是不同 tuple struct 的例項

  • Unit-Like Struct (無任何欄位)

    可以定義沒有任何欄位的 struct,叫做 Unit-Like struct (因為與(),單元型別類似)

    適用於需要在某個型別上實現某個 trait,但是在裡面又沒有想要儲存的資料

  • struct 資料的所有權:

    struct User {
        username: String,
        email: String,
        sign_in_count:u64,
        active:bool,
    }
    

    這裡的欄位使用了 String 而不是 &str:

    • 該 struct 例項擁有其所有的資料
    • 只要 struct 例項是有效的,那麼裡面的欄位資料也是有效的

    struct 裡也可以存放引用,但這需要使用生命週期