我没有在高级特征的道路上徘徊太多,但我想知道是否可以通过创建一个仅覆盖更复杂特征的一个或三个函数的特征来节省重写/复制和粘贴九个函数。
这是我今晚用 PrettyFormatter 做的一些实验serde_json
,我想创建一个 PrettyFormatter 的版本,它只是改变了 Vec 的打印方式。
我应该注意到这个想法来自这个答案,不同之处在于我正在使用 serde_json 并且对删除代码重复感兴趣,但答案可能仍然是“不可能,请检查RFC ”。不能重用已经可用的代码似乎很浪费。
这是我似乎失败的最小案例:
trait Formatter {
fn begin_array_value(&self) {
println!("Formatter called");
}
fn two(&self) {
println!("two")
}
// ... pretend there are a few more functions ...
fn ten(&self) {
println!("ten")
}
}
trait PrettyFormatter: Formatter {
fn begin_array_value(&self) {
println!("I'm pretty!");
}
}
struct MyFormatter { }
// This fails:
impl PrettyFormatter for MyFormatter { }
// This works:
//impl Formatter for MyFormatter { }
fn main() {
let formatter = MyFormatter { };
formatter.begin_array_value();
}
具体来说,错误是这样的:
Standard Error
Compiling playground v0.0.1 (/playground)
error[E0277]: the trait bound `MyFormatter: Formatter` is not satisfied
--> src/main.rs:16:6
|
8 | trait PrettyFormatter: Formatter {
| --------- required by this bound in `PrettyFormatter`
...
16 | impl PrettyFormatter for MyFormatter { }
| ^^^^^^^^^^^^^^^ the trait `Formatter` is not implemented for `MyFormatter`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.
error: could not compile `playground`
To learn more, run the command again with --verbose.
我可以复制和粘贴大约 320 行,但我非常喜欢编写尽可能少的代码。如果这是可能的,我想向那个箱子提交一个 PR,这样其他人就可以从 PrettyFormatter 特征中工作。