apt*_*002 4 traits lifetime rust borrow-checker
在此代码中,匹配标准库中MyDeref
的定义,并且(从更复杂的示例简化)几乎也匹配。Deref
MemoryView
pub trait MyDeref {
type Target: ?Sized;
fn deref<'a>(&'a self) -> &'a Self::Target;
}
pub trait MemoryView {
type T;
fn at_ref<'a>(&'a self) -> &'a Self::T;
}
Run Code Online (Sandbox Code Playgroud)
我期望这些特征能够组合起来,这样我就可以编写一个MemoryView
覆盖任何取消引用 a 的类型的全面实现MemoryView
:
impl<V: MemoryView, T: MyDeref<Target=V>> MemoryView for T {
type T = V::T;
fn at_ref<'a>(&'a self) -> &'a Self::T {
self.deref().at_ref()
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到编译器错误:
error[E0309]: the parameter type `V` may not live long enough
--> src/lib.rs:14:9
|
14 | self.deref().at_ref()
| ^^^^^^^^^^^^ ...so that the type `V` will meet its required lifetime bounds
Run Code Online (Sandbox Code Playgroud)
似乎是在说方法签名暗示着并且Self
寿命Self::T
长于'a
,但并不是Self::Target
寿命长于a
。
我很难想象 a 的Self::Target
寿命怎么可能比Self
. Deref
对于明显的类型,例如&'a Target
和,这是不可能的Box<Target>
。
我也在努力写出某种特征界限,表明Self::Target
寿命比 更长Self
。
这种全面实施感觉应该是可能的。帮助!
这是其中一种情况,您做错了一些事情,导致编译器非常困惑,以至于建议您做一些无助于解决根本问题的事情。
您可以使用(否则不必要的)生命周期 GAT 来消除此错误,然后编译器可以揭示真正的问题:V
在实现中不受限制MemoryView for T
。因为V
不受约束,所以编译器无法真正看到它与其他生命周期有何关系,从而推断出适当的生命周期V
......即使您可以解决这个问题,无论如何也不能拥有不受约束的泛型类型参数,因此它是一个有争议的问题。
解决方案是完全删除该V
参数。您在这里使用它的唯一原因是您可以要求T::Target
实现MemoryView
- 因此只需添加该绑定,然后type T
相应地调整实现:
impl<T> MemoryView for T
where
T: MyDeref,
<T as MyDeref>::Target: MemoryView,
{
type T = <<T as MyDeref>::Target as MemoryView>::T;
fn at_ref<'a>(&'a self) -> &'a Self::T {
self.deref().at_ref()
}
}
Run Code Online (Sandbox Code Playgroud)
(游乐场)
归档时间: |
|
查看次数: |
80 次 |
最近记录: |