在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 生存期,但是它实现了AsRef
特性。那么,为什么书中有此内容,而不是Rust中的实际代码呢?在哪里可以找到书中提到的“全面实施”?
答案 0 :(得分: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 already stated一样,在这种情况下,指定'a
的要求在Rust 1.31中也已删除,即为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周的开发时间,许多源代码都已更改。
答案 1 :(得分:4)
引用始终是通用的。实际上,&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
的生存期。