我有一个使用match
来确定要调用哪个Serde反序列化函数的特征(我在这里放了Self::default
作为占位符).特征定义中的实现对于实现特征的所有 struct ("yaml"
和"json"
)所支持的格式具有匹配臂.还有一些 struct 也支持"csv"
,所以我为这些 struct 制作了一个专门的方法,并重写了match
.
有没有一种方法可以不重写相同的方法,只添加一个匹配手臂?在我的实际代码中,这个函数做其他的事情,所以复制、粘贴和添加一个匹配手臂是很烦人的.
下面是一个例子:
pub trait MyTrait: Default {
fn from_file(format: &str) -> Self {
match format {
"yaml" => Self::default(),
"json" => Self::default(),
_ => panic!(),
}
}
}
#[derive(Debug, Default)]
struct MyStruct {a: i32, b: i32}
impl MyTrait for MyStruct {
fn from_file(format: &str) -> Self {
match format {
"yaml" => Self::default(),
"json" => Self::default(),
"csv" => Self { a: 1, b: 1 },
_ => panic!(),
}
}
}
fn main() {
let example1 = MyStruct::from_file("yaml");
dbg!(example1);
let example2 = MyStruct::from_file("csv");
dbg!(example2);
}