在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中的实际代码呢?在哪里可以找到书中提到的“全面实施”?
AsRef
始终是编译器根据给定情况确定的生存期的&T
。当为引用类型实现某些内容时,必须使用some way指定此生存期。
曾经有一段时间,在实现语句中没有生存期淘汰的可能性。这在编译器的版本&'a T
中进行了更改,但是因此无需更改所有现有的工作代码。下面的代码今天可以使用,但不能在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
上很容易找到常见的模式,这使代码看起来更简洁。但是,生存期省略仅适用于功能。即使看上去很明显,其他地方仍然需要提供生命周期注释。在这种情况下,生存期infer what you meant是任何生存期-不管所讨论的'a
的生存期是什么。
[&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周的开发时间,其中很多更改了源代码。