default trait 顾名思义是默认值,即rust为特定类型实现 default 特性时,可以为该类型赋予了可选的默认值。使用default trait为类型提供缺省值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宏#[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); // adefault trait 使用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]属性实现
PROFIBUS-DP主站转ETHERNET/IP网关ethernet和tcp/ip的区别
腾讯公开一项“游戏机”的专利,主攻游戏娱乐
Modem 拨号上网
华为Harmony OS 2.0手机Beta版刷机包流出
技术产品加持,威迈斯IPO上市进一步实现与产业的深度融合
rust语言基础学习: Default trait
华为领导者怎么样?华为P10详细评测:原来你是这样的leader
涡轮增压发动机是什么?涡轮增压发动机怠速与积碳的关系
变频调速器原理_变频调速器应用
华为金融云网方案实现多云多厂商全场景网络服务化
如何快速分辨优质电动车与劣质电动车,只需查看三个地方
蓄电池内部严重短路故障修理
关于RTOS任务间通信和全局变量之间的区别解析
星际家园区块链平台APP开发
抢先体验苹果iOS10.3 全新iPad单手浮动键盘,肯定超炫酷的
15款最新的高科技_亮瞎你的眼!
VIVADO中时序报告中WNS、WHS、TNS、THS有什么含义
清摄像机和高清网络摄像机的差别是什么,都具有什么特点
探索未来中国物联网市场的战略发展重点
MySQL缓冲区设计介绍