电子说
Default trait 属于std::default::Default ,先看一下它的定义:
pub trait Default {
fn default() -> Self;
}
比较简单,为类型实现Default trait的方式:
如果类型中的包含的其他类型都实现了Default trait,就可以通过derive宏
#[derive(Default)]
为类型自动实现Default trait。
手动实现Default trait:impl Defalut for A
枚举的#[default]属性
#[derive(Default)]
和手动实现实现Default trait结合//
假如unpaid和paid不实现defalut,则编译无法通过
#[derive(Debug)],
pub enum PayStatus {
Unpaid,
Paid,
}
// 为枚举PayStatus手工实现
impl Default for PayStatus {
fn default() -> Self {
PayStatus::Unpaid
}
}
// Price的所有字段类型都实现了Default, 因此可以derive Default
#[derive(Default, Debug)]
pub struct Price {
original_price: f64,
discounted_price: f64,
}
// Order的所有字段类型都实现了Default,因此可以derive Default
#[derive(Default, Debug)]
pub struct Order {
id: i64,
pay_status: PayStatus,
price: Price,
}
2.枚举的#[default] 属性 : enum 枚举上使用 #[derive(Default)] 时,可以通过在变体上放置 #[default] 属性来简化实现。
#[derive(Default)]
enum Kind {
#[default]
A,
B,
C,
}
let kind = Kind::default();
println!("{:?}", kind); // A
Rust是非空类型的,类型需要初始化即赋值,如果没有一个默认值,需要写大量冗余代码给该类型赋初始值,这就需要一种简便的方式生成初始值,即Default trait, Rust 为各种原始类型实现 Default。
当类型实现了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为类型提供缺省值,即帮你创建一个类型的默认值。派生宏#[derive(Default)]
意味着自动实现了 default 函数。default 函数的派生实现调用了类型每部分的 default 函数,这意味着类型中所有的字段也必须实现了Default trait 。
为自己的类型(比如结构体,枚举等)实现Default trait的方式:
#[derive(Default)]
impl Defalut for A
#[default]
属性实现全部0条评论
快来发表一下你的评论吧 !