2

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。这似乎在任何地方都没有任何生命周期,但它实现了这个AsRef特征。那么为什么这本书有这个,而不是 Rust 中的实际代码呢?在哪里可以找到书中提到的“一揽子实施”?

4

2 回答 2

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 已经指出的那样,在这种情况下指定 的要求'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)
    }
}

您查看的源代码对应于 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 周的开发时间,源代码有很多变化。

于 2019-09-25T02:37:15.980 回答
4

引用总是通用的生命周期。实际上,在编译器根据给定情况建立的某个生命周期内,a&T始终是 a 。在为引用类型实现某些东西时&'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

于 2019-09-20T14:49:09.770 回答