问题背景:
Rust坚持明确初始化的哲学。对于某些标准集合和泛型类型,通常需要有一个“默认”值。然而,对于复杂结构,通常会有如何在没有参数的情况下创建它们的歧义。为此引入了Default trait,它定义了标准构造函数。
问题:
要编写通用容器和算法,有时会期望有默认值(例如,在Option::unwrap_or_default、Vec::resize中),需要一种机制来创建实例而不传递参数。但并不是所有类型都适合这种构造,有时默认值可能并不明显且存在风险。
解决方案:
default()方法,返回某个实例(通常是“空的”、零值或满足某些条件的)。代码示例:
#[derive(Default, Debug)] struct Config { retries: u32, verbose: bool, } fn main() { let cfg = Config::default(); println!("{:?}", cfg); }
关键特性:
如果T: Default,Option<T>的Default::default会被强制调用吗?
不会,Optional不会自动为T调用default;unwrap_or_default是显式调用的。
在结构的构造函数中,默认值参数可以通过Default trait指定吗?
不能,Default会创建整个结构,单个字段的默认值不能通过常规构造函数语法来替代。
如果结构的字段没有实现Default,derive(Default)会失败吗?
会,derive(Default)仅在所有字段实现Default时有效。
Config c Default,其中服务器端口为0(无效的默认值)。程序意外以错误的端口启动。
优点:
缺点:
默认用于具有安全共识值的配置结构(retries=3,verbose=false)。
优点:
缺点: