不带任何参数的方法的显式生存期有什么意义?

问题描述 投票:0回答:3

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生存期,但是它实现了convert.rs特性。那么,为什么书中有此内容,而不是Rust中的实际代码呢?在哪里可以找到书中提到的“全面实施”?

rust lifetime lifetime-scoping
3个回答
2
投票
参考始终是一生中通用的。实际上,AsRef始终是编译器根据给定情况确定的生存期的&T。当为引用类型实现某些内容时,必须使用

some way指定此生存期。

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

1.31

因此,在这种情况下,寿命参数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

1
投票
每个参考都有关联的生存期。在函数签名中,您经常可以忽略它们,因为在'a上很容易找到常见的模式,这使代码看起来更简洁。

但是,生存期省略仅适用于功能。即使看上去很明显,其他地方仍然需要提供生命周期注释。在这种情况下,生存期infer what you meant是任何生存期-不管所讨论的'a的生存期是什么。


0
投票
[&T的自变量中未使用

当然是。该函数使用速记符号,可以将其扩展:

as_ref

也未绑定到fn as_ref(&self) // becomes fn as_ref(self: &Self) // becomes fn as_ref(self: &&'a T) 的输出

正确

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

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

作为&U,在Rust 1.31中删除了在这种情况下指定E_net4 already stated的要求,作为'a

您从书中提供的代码与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
这大约需要42周的开发时间,其中很多更改了源代码。
© www.soinside.com 2019 - 2024. All rights reserved.