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結(jié)合
//
假如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 的結(jié)果。
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
}
}
總結(jié)
Default trait為類型提供缺省值,即幫你創(chuàng)建一個類型的默認值。派生宏#[derive(Default)]
意味著自動實現(xiàn)了 default 函數(shù)。default 函數(shù)的派生實現(xiàn)調(diào)用了類型每部分的 default 函數(shù),這意味著類型中所有的字段也必須實現(xiàn)了Default trait 。
為自己的類型(比如結(jié)構(gòu)體,枚舉等)實現(xiàn)Default trait的方式:
- 通過派生宏實現(xiàn)
#[derive(Default)]
- 通過手動實現(xiàn)
impl Defalut for A
- 枚舉可以使用
#[default]
屬性實現(xiàn)
-
Default
+關(guān)注
關(guān)注
0文章
4瀏覽量
8048 -
rust語言
+關(guān)注
關(guān)注
0文章
57瀏覽量
3009
發(fā)布評論請先 登錄
相關(guān)推薦
評論