Rust 入門 - Struct

結(jié)構(gòu)體

結(jié)構(gòu)體定義

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

#[derive(Debug)]

// Debug 的輸出格式。Debug 是一個(gè) trait,它允許我們以一種對(duì)開(kāi)發(fā)者有幫助的方式打印結(jié)構(gòu)體,以便當(dāng)我們調(diào)試代碼時(shí)能看到它的值。
struct Rectangle {
    width: u32,
    height: u32,
}

使用

let user = User {
    email: String::from("apple@apple.com"),
    username: String::from("apple"),
    active: true,
    sign_in_count: 1,
};
println!(
    "name= {}, email = {}, active = {}, sign = {}",
    user.username, user.email, user.active, user.sign_in_count
);

可變的

let mut user = User {
    email: String::from("apple@apple.com"),
    username: String::from("apple"),
    active: true,
    sign_in_count: 1,
};
user.email = String::from("google@google.com");
println!(
    "name= {}, email = {}, active = {}, sign = {}",
    user.username, user.email, user.active, user.sign_in_count
);

快捷構(gòu)建

let user = build_user(String::from("a@a.com"), String::from("fk"));
println!(
    "name= {}, email = {}, active = {}, sign = {}",
    user.username, user.email, user.active, user.sign_in_count
);

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

元組結(jié)構(gòu)體 tuple structs

定義元組結(jié)構(gòu)體,以 struct 關(guān)鍵字和結(jié)構(gòu)體名開(kāi)頭并后跟元組中的類型。

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
println!("black = {}, {}, {}", black.0, black.1, black.2);
println!("origin = {}, {}, {}", origin.0, origin.1, origin.2);

struct 程序

let width = 40;
let height = 40;
println!("area = {}", area(width, height));

fn area(width: u32, height: u32) -> u32 {
    width * height
}

使用元組讓代碼更易讀

let rect = (40, 40);
println!("area = {}", area1(rect));

fn area1(dimensions: (u32, u32)) -> u32 {
    dimensions.0 * dimensions.1
}

使用結(jié)構(gòu)體讓代碼包含更多含義

let rectangle = Rectangle {
    width: 32,
    height: 32,
};
println!("area {}", area2(&rectangle));


//函數(shù) area 現(xiàn)在被定義為接收一個(gè)名叫 rectangle 的參數(shù),其類型是一個(gè)結(jié)構(gòu)體 Rectangle 實(shí)例的不可變借用。第四章講到過(guò),我們希望借用結(jié)構(gòu)體而不是獲取它的所有權(quán),這樣 main 函數(shù)就可以保持 rectangle 的所有權(quán)并繼續(xù)使用它,所以這就是為什么在函數(shù)簽名和調(diào)用的地方會(huì)有 &
fn area2(rectangle: &Rectangle) -> u32 {
    rectangle.width * rectangle.height
}

通過(guò)派生 trait 增加實(shí)用功能


#[derive(Debug)]

// Debug 的輸出格式。Debug 是一個(gè) trait,它允許我們以一種對(duì)開(kāi)發(fā)者有幫助的方式打印結(jié)構(gòu)體,以便當(dāng)我們調(diào)試代碼時(shí)能看到它的值。
struct Rectangle {
    width: u32,
    height: u32,
}

println!("rectangle = {:?}", rectangle);
println!("rectangle = {:#?}", rectangle);

定義方法

println!("rectangle = {}", rectangle.area());

// 方法的第一個(gè)參數(shù)總是 self,它代表調(diào)用該方法的結(jié)構(gòu)體實(shí)例。
impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}
let rect1 = Rectangle {
    width: 30,
    height: 50,
};
let rect2 = Rectangle {
    width: 10,
    height: 40,
};
let rect3 = Rectangle {
    width: 60,
    height: 45,
};

println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));

// 方法的第一個(gè)參數(shù)總是 self,它代表調(diào)用該方法的結(jié)構(gòu)體實(shí)例。
impl Rectangle {

    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

關(guān)聯(lián)函數(shù)

允許在 impl 塊中定義 不 以 self 作為參數(shù)的函數(shù)

let sq = Rectangle::square(3);
println!("sq = {:#?}", sq);

impl Rectangle {
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容