Default trait 顧名思義是默認值,即Rust為特定類型實現(xiàn) Default 特性時,可以為該類型賦予了可選的默認值。
使用Default trait為類型提供缺省值
Default trait 屬于std::default::Default ,先看一下它的定義:
pub trait Default {
fn default() -> Self;
}
比較簡單,為類型實現(xiàn)Default trait的方式:
-
如果類型中的包含的其他類型都實現(xiàn)了Default trait,就可以通過derive宏
#[derive(Default)]為類型自動實現(xiàn)Default trait。 -
手動實現(xiàn)Default trait:impl Defalut for A
-
枚舉的#[default]屬性
- 通過derive宏
#[derive(Default)]和手動實現(xiàn)實現(xiàn)Default trait結合
// 假如unpaid和paid不實現(xiàn)defalut,則編譯無法通過
#[derive(Debug)],
pub enum PayStatus {
Unpaid,
Paid,
}
// 為枚舉PayStatus手工實現(xiàn)
impl Default for PayStatus {
fn default() -> Self {
PayStatus::Unpaid
}
}
// Price的所有字段類型都實現(xiàn)了Default, 因此可以derive Default
#[derive(Default, Debug)]
pub struct Price {
original_price: f64,
discounted_price: f64,
}
// Order的所有字段類型都實現(xiàn)了Default,因此可以derive Default
#[derive(Default, Debug)]
pub struct Order {
id: i64,
pay_status: PayStatus,
price: Price,
}
2.枚舉的#[default] 屬性 : enum 枚舉上使用 #[derive(Default)] 時,可以通過在變體上放置 #[default] 屬性來簡化實現(xiàn)。
#[derive(Default)]
enum Kind {
#[default]
A,
B,
C,
}
let kind = Kind::default();
println!("{:?}", kind); // A
Default trait 使用
Rust是非空類型的,類型需要初始化即賦值,如果沒有一個默認值,需要寫大量冗余代碼給該類型賦初始值,這就需要一種簡便的方式生成初始值,即Default trait, Rust 為各種原始類型實現(xiàn) Default。
當類型實現(xiàn)了Default trait之后,在初始化時,可以部分初始化,其余部分使用Default::default()初始化。
fn main() {
let order1 = Order::default();
let order2 = Order {
id: 100,
..Order::default()
};
println!("order1 = {:?}", order1);
println!("order2 = {:?}", order2);
}
在泛型編程的語境中,Default trait也可顯其威力和方便性
fn guarantee_length
當你在 Option 實例上使用 unwrap_or_default 方法時, Default trait是必須的。如果 Option 是 None 的話, unwrap_or_default 方法將返回 T 類型的 Default::default 的結果。
struct Canvas;
enum Shape {
Circle,
Rectangle,
}
impl Canvas {
// let user optionally pass a color
// 用戶可選地傳入一個 color
fn paint(&mut self, shape: Shape, color: Option) {
// if no color is passed use the default color
// 若用戶沒有傳入 color ,即使用默認的 color
let color = color.unwrap_or_default();
// etc
}
}
總結
Default trait為類型提供缺省值,即幫你創(chuàng)建一個類型的默認值。派生宏#[derive(Default)]意味著自動實現(xiàn)了 default 函數(shù)。default 函數(shù)的派生實現(xiàn)調用了類型每部分的 default 函數(shù),這意味著類型中所有的字段也必須實現(xiàn)了Default trait 。
為自己的類型(比如結構體,枚舉等)實現(xiàn)Default trait的方式:
- 通過派生宏實現(xiàn)
#[derive(Default)] - 通過手動實現(xiàn)
impl Defalut for A - 枚舉可以使用
#[default]屬性實現(xiàn)
-
Default
+關注
關注
0文章
4瀏覽量
8328 -
rust語言
+關注
關注
0文章
57瀏覽量
3279
發(fā)布評論請先 登錄
聊聊Rust與C語言交互的具體步驟
基于Rust語言Hash特征的基礎用法和進階用法
Rust語言中的反射機制
Rust語言如何與 InfluxDB 集成
基于Rust語言中的生命周期
Rust中的From和Into trait的基礎使用方法和進階用法
Rust 語言中的 RwLock內部實現(xiàn)原理
如何用 rust 語言開發(fā) stm32
如何利用C語言去調用rust靜態(tài)庫呢
在trait中使用 `async fn`
以調試Rust的方式來學習Rust
為什么Borrow和BorrowMut被定義為泛型trait呢?
rust語言基礎學習: 智能指針之Cow
實現(xiàn)Rust Trait類型 那么該類型的引用也實現(xiàn)了trait嗎?
適合嵌入式設備開發(fā)的編程語言—Rust語言
rust語言基礎學習: Default trait
評論