[英]How to require a trait in another trait correctly?
我试着写两个特征,其中一个需要另一个实现并得到这个错误:
error[E0277]: the trait bound `T: ValTrait` is not satisfied
--> src/main.rs:20:1
|
20 | / fn get<T: ValRequireTrait + std::fmt::Debug>(_t: T) {
21 | | println!("{:?}", T::VAL);
22 | | }
| |_^ the trait `ValTrait` is not implemented for `T`
|
= help: consider adding a `where T: ValTrait` bound
= note: required by `ValRequireTrait`
代码 :
trait ValTrait<T = Self> {
const VAL: T;
}
trait ValRequireTrait<T: ValTrait = Self> {}
#[derive(Debug, Copy, Clone)]
struct A {
field: u64,
}
impl ValTrait for A {
const VAL: A = A {
field: 0u64
};
}
impl ValRequireTrait for A {}
fn get<T: ValRequireTrait + std::fmt::Debug>(_t: T) {
println!("{:?}", T::VAL);
}
fn main() {
let a = A { field: 6u64 };
get(a);
}
怎么做到这一点? 如果我按照编译器说的那样做,我将不需要ValRequireTrait
因为它将是无用的。 我希望ValRequireTrait
成为结构实现我需要的足够方法的标记。
换句话说,我希望这样的要求是可传递的,所以当在get()
函数中我需要一个特征( ValRequireTrait
)时,其他( ValTrait
)将自动被要求,而不需要编译器想要的代码中的任何规范。
听起来你想要ValTrait
成为ValRequireTrait的ValRequireTrait
。 可以在Rust书(第2版)中找到一个很好的介绍:
有时,我们可能希望某个特性能够依赖于在我们的特征实现的任何地方实施的另一个特征,以便我们的特征可以使用其他特征的功能。 所需的特质是我们正在实施的特质的超级特征。
如果您更改此行:
trait ValRequireTrait<T: ValTrait = Self> {}
对此,编译很好:
trait ValRequireTrait<T: ValTrait = Self>: ValTrait<T> {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.