第一反應,Rust結構體跟python的很像,不知道感覺對不對;
書中提到第一反應,Rust結構體跟python的很像,不知道感覺對不對;
書中提到:結構體是一種自定義數據類型,它允許命名多個相關的值并將他們組成一個有機的結合體。
Rust中定義結構體的關鍵字是struct
struct User {username:String,email:String,active:bool,
}
上述就是定義的一個名字為User的結構體,這也能體現出一個結構體的好處(當然所有具備結構體的語言都有的好處),通過定義的名稱可以明白每個字段的意義,比如這個結構體就是在描述一個“用戶”的對象,包含了“用戶名”、“郵箱”、“激活狀態”等用戶參數。當然結構體本身并不是一個對象,它更類似一個創建對象的模板,比如基于User結構體創建一個對象
let user1 = User {email:String::from("someone@email.cn"),username:String::from("username"),active:true,
}
上述user1就是一個使用User創建的對象(或者叫做實例)。
我們可以針對對象進行字段的修改,但是務必注意,在Rust中有mut參數表示是可修改的,上面的user1是不可修改的(Rust機制),如果需要修改就必須全部可修改,如下user2
let mut user2 = User {email:String::from("someone@email.cn"),username:String::from("username"),active:true,
}
還記得“mut”不?不記得可以往前看看。
這時user2所有的字段都可以修改了
修改方式為
user2.username = String::from("user2");
Rust結構體中有幾個快捷用法(其他語言中也有類似的用法)
?? ?1. 創建對象時,如果參數與結構體字段擁有完全一致的名稱,可以按照如下方式簡寫;
let email = String::from("email");
let username = String::from("username");
let user3 = User {email,username,active:true,
}
?? ?2. 還有一種方式就是快速繼承另外一個對象的內容
let user4 = User {email: String::from("email"),..user3
};
相當于user4的參數除了email外都跟user3的一致。
?? ?3. 還有一種簡寫的方式就是直接用元組定義,也稱為“元組結構體”
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
let black = Color(0,0,0);
與C語言的結構體不同的是,Rust中的結構體可以包含方法,方法是被定義在結構體的上下文中,比如給User一個查看名字的方法
impl User {fn getname(&self) -> String {self.username}
}
定義了方法,通過實例后面加點號,并跟上方法名、括號及所需要的參數進行調用。
user1.getname();
拷貝原文內容,供大家參考:
結構體可以讓我們基于特定領域創建有意義的自定義類型。通過使用結構體,你可以將相關聯的數據組合起來,并為每條數據賦予名字,從而使代碼變得更加清晰。方法可以讓我們為結構體實例指定行為,而關聯函數則可以將那些不需要實例的特定功能放置到結構體的命名空間中。
[1] 《Rust權威指南》01-2019-4420 第五章