結(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,
}
}
}