如何使一个特质仅限于实现另一个特质的类型,其中"&Self"自我是特质的类型?



例如,我希望每个MyTrait都实现AddAssign<&'a Self>。这是我在将'a放在编译器想要的位置后得到的:

trait MyTrait<'a>: 'a + std::ops::AddAssign<&'a Self> {}
fn func<'a, T: MyTrait<'a>>(a: &mut T, b: T) {
*a += &b;
}

此代码失败,并出现以下错误:

error[E0597]: `b` does not live long enough
--> src/main.rs:4:11
|
3 | fn func<'a, T: MyTrait<'a>>(a: &mut T, b: T) {
|         -- lifetime `'a` defined here
4 |     *a += &b;
|           ^^
|           |
|           borrowed value does not live long enough
|           requires that `b` is borrowed for `'a`
5 | }
| - `b` dropped here while still borrowed
For more information about this error, try `rustc --explain E0597`.

如何告诉编译器&b将只在该和的持续时间内使用?

您可以使用排名更高的特征绑定,使约束在整个生命周期内具有通用性,这样它就不会被限制为使用特征上定义的特征:

pub trait MyTrait: for<'a> std::ops::AddAssign<&'a Self> {}
// ^^^^^^^

相关内容

最新更新