不带任何参数的方法的显式生命周期的意义何在?

时间:2019-09-20 14:30:21

标签: rust lifetime lifetime-scoping

Programming Rust的第295页上,您可以找到以下内容:

  

幸运的是,标准库包含了整体实现:

impl<'a, T, U> AsRef<U> for &'a T
where
    T: AsRef<U>,
    T: ?Sized,
    U: ?Sized,
{
    fn as_ref(&self) -> &U {
        (*self).as_ref()
    }
}

我对在那里使用&'a感到困惑。这是什么背景? as_ref的参数中未使用它,也未将其绑定到&U的输出中。在这种情况下使用时,我认为我并不完全了解生命周期。

我进行了查找,因为我仍然不了解它,并且答案仍然没有点击(有意义)。我找到了convert.rs。这似乎在任何地方都没有 any 生存期,但是它实现了AsRef特性。那么,为什么书中有此内容,而不是Rust中的实际代码呢?在哪里可以找到书中提到的“全面实施”?

2 个答案:

答案 0 :(得分:5)

  

as_ref的参数中未使用它

最肯定的是。该函数使用速记符号,可以将其扩展:

fn as_ref(&self) // becomes
fn as_ref(self: &Self) // becomes
fn as_ref(self: &&'a T)
  

也未绑定到&U

的输出

正确。

  

那为什么书里有这个,而不是Rust中的实际代码?

Rust每6周发布一次新的稳定版本。大概这本书没有,所以很可能他们使用的是Rust的旧版本。希望本书能告诉您他们开发的版本。

E_net4 already stated一样,在这种情况下,指定'a的要求在Rust 1.31中也已删除,即为documented in the edition guide

您从书中提供的代码与found in Rust 1.30相匹配:

impl<'a, T: ?Sized, U: ?Sized> AsRef<U> for &'a T where T: AsRef<U>
{
    fn as_ref(&self) -> &U {
        <T as AsRef<U>>::as_ref(*self)
    }
}

您查看过的corresponds to Rust 1.37源代码:

impl<T: ?Sized, U: ?Sized> AsRef<U> for &T where T: AsRef<U>
{
    fn as_ref(&self) -> &U {
        <T as AsRef<U>>::as_ref(*self)
    }
}

这大约需要42周的开发时间,许多源代码都已更改。

答案 1 :(得分:4)

引用始终是通用的。实际上,&T在编译器根据给定情况确定的生命周期中始终是&'a T。在为引用类型实现某些内容时,必须以某种方式指定此生存期。

曾经有一段时间,实现语句中没有生存期淘汰的可能性。这在编译器的1.31版本中进行了更改,但是因此无需更改所有现有的工作代码。以下代码今天可以使用,但不能在1.30.0版本中使用:

trait Foo {
    fn foo(&self) {}
}

impl<T: ?Sized> Foo for &T {} // error[E0106]: missing lifetime specifier

因此,在这种情况下,生命周期参数'a是明确的。它与&self&U中的生存期相关的唯一方法是与'a有协方差:由于self = &'a T绑定到生存期'a,还暗含了&self的生存期不得超过'a的生存期。