同一特性的不同实现特性类型不兼容,因为基础类型可能不同.这意味着为同一特性的不同实现特性类型生成的机器代码可以是不同的.但有时铁 rust 代码本身是相同的.那么,如果没有dyn特性,对于相似但不兼容的类型,是否有可能避免重复和重用相同的代码呢?这是可以实现的吗?还是我提出了一些不合理的要求?我想编写第二个示例,但要像第一个一样工作.
fn foo_true() -> impl Foo {
Bar
}
fn foo_false() -> impl Foo {
Baz
}
trait Foo {
fn foo(&self) {}
}
struct Bar;
impl Foo for Bar {}
struct Baz;
impl Foo for Baz {}
fn f(b: bool) {
// solution 1: works, but code duplication
{
if b {
foo_true().foo()
} else {
foo_false().foo()
};
}
// solution 2: doesn't work, no code duplication
{
let v = if b { foo_true() } else { foo_false() }; // `if` and `else` have incompatible types
v.foo();
}
// solution 3: works, no code duplication, but unnecessary perf hit
{
let v: Box<dyn Foo> = if b {
Box::new(foo_true())
} else {
Box::new(foo_false())
};
v.foo();
}
}
我看了一下 crate ,或者自己做了类似的事情,但它仍然需要代码复制,只是以一种更封装的方式.
另外,这只是一个简化的例子,在我的实际代码中,foo
部分总是相同的,它不只是碰巧相同,我认为你永远不应该复制和粘贴.有时重复代码是可以的,而不是试图找到一种真正复杂的方法来完成它,只是让您在将来更改它,并且根本不需要它,但这不是那种情况.