对于不带任何参数的方法,显式生命周期有何意义?

Eva*_*oll 2 lifetime rust lifetime-scoping

在编程 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

我对&'a那里的使用感到困惑。这是什么背景?这不是在争论中使用as_ref,也不依赖于输出&U。我不认为我完全理解在这种情况下使用的生命周期。

我查了一下这个,因为我仍然不明白,而且答案仍然没有点击(有意义)。我发现convert.rs. 这似乎在任何地方都没有任何生命周期,但它实现了AsReftrait。那么为什么这本书有这个,而不是 Rust 中的实际代码?我在哪里可以找到书中提到的“一揽子实施”?

She*_*ter 5

它没有用于论证 as_ref

它肯定是。该函数使用速记符号,可以扩展:

fn as_ref(&self) // becomes
fn as_ref(self: &Self) // becomes
fn as_ref(self: &&'a T)
Run Code Online (Sandbox Code Playgroud)

也不依赖于输出 &U

正确的。

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

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

正如E_net4 已经声明的那样,'a在 Rust 1.31 中删除了在这种情况下指定 的要求,如版本指南中所述。

您从书中提供的代码与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)
    }
}
Run Code Online (Sandbox Code Playgroud)

您查看的源代码对应于 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是大约 42 周的开发时间,足以让源代码发生变化。