Rust 生命周期省略对trait impls中的方法有效吗?

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

有了这个问题,我想从在这个领域有更多知识的人那里得到反馈。我决不是专家。所以我不妨先问我的问题:我的推理正确吗

问题 基于这一点,我很困惑地看到在trait方法的实现中省略了生命周期:

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 ()>>,
}