一个不接受任何参数的方法的显式生命周期有什么意义?
What is the point of an explicit lifetime for a method that doesn't take any arguments?
在 Programming Rust 的第 295 页,您可以找到以下内容:
Fortunately, the standard library includes the blanket implementation:
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 中的实际代码?哪里可以找到书中提到的"blanket implementation"?
引用总是对一生通用。实际上,编译器根据给定情况建立的某个生命周期中,&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
.
It's not being used in an argument of as_ref
肯定是。该函数使用了shorthand表示法,可以扩展为:
fn as_ref(&self) // becomes
fn as_ref(self: &Self) // becomes
fn as_ref(self: &&'a T)
nor tied to the output of &U
正确。
So why does the book have this, and not the actual code in Rust?
Rust 每 6 周发布一次新的稳定版本。大概这本书没有,所以他们很可能使用的是旧版本的 Rust。希望这本书告诉你他们开发的版本。
如, the requirement to specify the 'a
in this case was removed in Rust 1.31, as 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 周的开发时间,源代码更改的时间足够了。
在 Programming Rust 的第 295 页,您可以找到以下内容:
Fortunately, the standard library includes the blanket implementation:
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 中的实际代码?哪里可以找到书中提到的"blanket implementation"?
引用总是对一生通用。实际上,编译器根据给定情况建立的某个生命周期中,&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
.
It's not being used in an argument of
as_ref
肯定是。该函数使用了shorthand表示法,可以扩展为:
fn as_ref(&self) // becomes
fn as_ref(self: &Self) // becomes
fn as_ref(self: &&'a T)
nor tied to the output of
&U
正确。
So why does the book have this, and not the actual code in Rust?
Rust 每 6 周发布一次新的稳定版本。大概这本书没有,所以他们很可能使用的是旧版本的 Rust。希望这本书告诉你他们开发的版本。
如'a
in this case was removed in Rust 1.31, as 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 周的开发时间,源代码更改的时间足够了。