一个不接受任何参数的方法的显式生命周期有什么意义?

What is the point of an explicit lifetime for a method that doesn't take any arguments?

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

Fortunately, the standard library includes the blanket implementation:

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 中的实际代码?哪里可以找到书中提到的"blanket implementation"?

引用总是对一生通用。实际上,编译器根据给定情况建立的某个生命周期中,&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.

It's not being used in an argument of as_ref

肯定是。该函数使用了shorthand表示法,可以扩展为:

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

nor tied to the output of &U

正确。

So why does the book have this, and not the actual code in Rust?

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

, the requirement to specify the 'a in this case was removed in Rust 1.31, as 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 周的开发时间,源代码更改的时间足够了。