【Rust】trait-派生
阿新 • • 發佈:2021-12-23
環境
- Rust 1.56.1
- VSCode 1.61.2
概念
參考:https://doc.rust-lang.org/rust-by-example/trait/derive.html
示例
編譯器可以通過 #[derive]
屬性提供派生(自動實現)功能,以下 trait 支援派生:
- 比較 trait:
Eq
,PartialEq
,Ord
,PartialOrd
Clone
,用來從&T
建立副本T
Copy
,使型別具有 “複製語義”而非 “移動語義”。Hash
,從&T
計算雜湊值(hash)。Default
,建立資料型別的一個空例項。Debug
,使用{:?}
formatter 來格式化一個值。
main.rs
// 自動實現比較的 trait #[derive(PartialEq, PartialOrd)] struct Centimeters(f64); // 自動實現 Debug trait #[derive(Debug)] struct Inches(i32); impl Inches { fn to_centimeters(&self) -> Centimeters { let &Inches(inches) = self; Centimeters(inches as f64 * 2.54) } } struct Seconds(i32); fn main() { let _one_second = Seconds(1); // 編譯錯誤,沒有實現 Debug trait // println!("One second looks like: {:?}", _one_second); // 編譯錯誤,沒有實現比較的 trait // let _this_is_true = (_one_second == _one_second); let foot = Inches(12); println!("One foot equals {:?}", foot); let meter = Centimeters(100.0); let cmp = if foot.to_centimeters() < meter { "smaller" } else { "bigger" }; println!("One foot is {} than one meter.", cmp); }
總結
瞭解了 Rust 中 trait 的派生,可以使用屬性來自動生成一個 trait 的實現。