在 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 中的实际代码呢?我在哪里可以找到书中提到的"一揽子实现"?
它没有用于
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 周的开发时间,足以让源代码发生变化。
引用总是通用的。实际上,&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
。