对于不接受任何参数的方法,显式生存期的意义何在?



在 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

相关内容

  • 没有找到相关文章

最新更新