例如,我想在 Rust 中为容器编写 trait:
trait Container: Default {
type ValueType;
}
但我也希望所有 Container
也可以 Clone
d 只有当 Container::ValueType
可以是 Clone
d:
// not Rust code
trait Container: Default + Clone if Self::ValueType: Clone {
type ValueType;
}
当然,我可以有条件地为具体容器本身实现 Clone
trait:
struct MyVec<T> {}
impl<T: Clone> Clone for MyVec<T> {/**/}
或使用 derive(Clone)
,但我想表达我对 Container
trait 的意图,而不是实现类型。
最佳答案
存在这种类似的语法:
trait Container: Default + Clone where Self::ValueType: Clone {
// ^^^^^
type ValueType;
}
但这不是有条件的,Container
只能针对满足all约束的类型实现:Default
、Clone
,而 Self::ValueType
是 Clone
。
我不确定这是否有用。 Rust 特征约束是显式的,这意味着除非存在约束,否则您不能使用某些东西。所以无论如何你都必须将它们包含在约束中。
fn use_container<C: Container>(c: C)
where
C: Clone,
C::ValueType: Clone
{
let _ = c.clone();
let _ = c.get_element().clone();
}
不管怎样,你必须在具体类型上实现 Clone
。
如果您的目标只是表明 “对于 Container
的实现,如果元素是 Clone
那么容器应该是克隆”,惯用 Rust 中的流行模式是仅在需要时限制您需要的内容。 (即如果一个函数需要克隆容器,则限制在 C: Clone
上;如果一个函数只需要克隆一个元素,则限制在 C::ValueType: Clone
上) .
关于Rust:条件特征继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64958073/