Rust 生命周期省略对trait impls中的方法有效吗?
有了这个问题,我想从在这个领域有更多知识的人那里得到反馈。我决不是专家。所以我不妨先问我的问题:我的推理正确吗 问题 基于这一点,我很困惑地看到在trait方法的实现中省略了生命周期:Rust 生命周期省略对trait impls中的方法有效吗?,rust,lifetime,Rust,Lifetime,有了这个问题,我想从在这个领域有更多知识的人那里得到反馈。我决不是专家。所以我不妨先问我的问题:我的推理正确吗 问题 基于这一点,我很困惑地看到在trait方法的实现中省略了生命周期: impl<'a, 'b, T> PartialEq<RefEquality<'b, T>> for RefEquality<'a, T> { fn eq(&self, other: &RefEquality<T>) -> b
impl<'a, 'b, T> PartialEq<RefEquality<'b, T>> for RefEquality<'a, T> {
fn eq(&self, other: &RefEquality<T>) -> bool {
self.0 as *const T == other.0 as *const T
}
}
在这里,我为该方法引入了一个任意的生存期'c
,这与编译器在生存期省略的情况下所做的基本相同
在我的trait impl中命名一个生命周期'b
,只是说它必须不同于'a
(我也没有以任何方式将它们联系起来)。从逻辑上讲,这是行不通的:
impl<'a, 'b, T> PartialEq<RefEquality<'b, T>> for RefEquality<'a, T> {
fn eq(&self, other: &RefEquality<'a, T>) -> bool {
self.0 as *const T == other.0 as *const T
}
}
省略的生存期将被推断为
'a
,保持所需的语义,即两个RefEquality
类型必须具有相同的生存期。让我们看看rustc的过程,以确定提供的impl
方法是否对应
在特征中声明的签名
代码中的位置是
在librustc\u typeck/check/compare\u method.rs
中,对它进行了很好的注释,
然而,对于那些不是编译器黑客的人来说,即使是这些评论也很难使用
我不是一名编译器开发人员,因此以下内容基于我的生锈经验
还有解释
trait中的声明对应于特定的函数类型,
impl
块中的定义被解析为它自己的函数类型
对于这个问题,我认为只有类型检查的结论是重要的:
- “impl函数是trait函数的子类型吗?”
这是什么。。。这是一个惊人的答案。感谢你为描述这一切所付出的努力!对于泛型的
t
,&t
是否应该是PhantomData>
,我知道&t
没有dropck含义,并且类型中已经有一个&t
。啊,对了,我把它与Rustonomicon中的示例混淆了。
impl<'a, 'b, T> PartialEq<RefEquality<'b, T>> for RefEquality<'a, T> {
fn eq(&self, other: &RefEquality<'a, T>) -> bool {
self.0 as *const T == other.0 as *const T
}
}
impl<'a, T> PartialEq<RefEquality<'a, T>> for RefEquality<'a, T> {
fn eq(&self, other: &RefEquality<T>) -> bool {
self.0 as *const T == other.0 as *const T
}
}
impl<'a, 'b, T> PartialEq<RefEquality<'b, T>> for RefEquality<'a, T> {
fn eq<'c>(&self, other: &RefEquality<'c, T>) -> bool {
panic!()
}
}
fn(&RefEquality<'a, T>, &RefEquality<'b, T>)
fn<'c>(&RefEquality<'a, T>, &RefEquality<'c, T>)
impl<'a, 'b, T> PartialEq<RefEquality<'b, T>> for RefEquality<'a, T> {
fn eq(&self, other: &RefEquality<'a, T>) -> bool {
panic!()
}
}
impl<'a, 'b: 'a, T> PartialEq<RefEquality<'b, T>> for RefEquality<'a, T> {
fn eq(&self, other: &RefEquality<'a, T>) -> bool {
panic!()
}
}
fn(&RefEquality<'a, T>, &RefEquality<'b, T>)
fn(&RefEquality<'a, T>, &RefEquality<'a, T>)
fn(Ref<'b>)
fn(Ref<'a>)
struct RefEquality<'a, T: 'a> {
ptr: &'a T,
marker: PhantomData<Cell<&'a ()>>,
}