为何为枚举派生的Default trait不适用于枚举的引用?
为什么Option<&Enum>无法直接调用unwrap_or_default()?有没有其他替代方案?
我定义了一个派生Default trait的枚举:
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)] pub enum Enum<T> { #[default] None, One(T), Two(T), }
当我对Vec的last()方法返回的Option<&Enum<i8>>调用unwrap_or_default()时,出现报错:
22 | println!("{:?}", v.last().unwrap_or_default()); | ^^^^^^^^ ----------------- required by a bound introduced by this call | | | the trait `Default` is not implemented for `&Enum<i8>` | = help: the trait `Default` is implemented for `Enum<T>` note: required by a bound in `Option::<T>::unwrap_or_default`
我自己找到了两种解决办法:
- 使用
unwrap_or()手动传入默认元素的引用:v.last().unwrap_or(&Enum::None) - 为引用类型
&Enum实现Default:impl<'a> Default for &'a Enum2 { fn default() -> &'a Enum2 { &Enum2::None } }
但我不理解为什么必须这么做,有没有其他可派生的trait能直接使用枚举中标记的默认元素?
上下文需求
我的目标是在格式化参数里实现:如果列表为空就输出“None”,不为空则输出最后一个元素的Display格式。我试过用match表达式:
match self.history.last() { None => "None", Some(val) => val }
但这种写法不合法,因为match的分支必须返回相同类型。由于val是借用的,且self没有实现Copy,很多其他方案都行不通,给枚举定义默认值就是为了避免额外的字符串格式化或内存分配。
内容的提问来源于stack exchange,提问作者Zannick
相关产品推荐
相关产品推荐

