第 295 页Rust 编程 http://shop.oreilly.com/product/0636920040385.do您可以找到以下内容:
幸运的是,标准库包含了总体实现:
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 https://doc.rust-lang.org/1.37.0/src/core/convert.rs.html。这个好像没有any任何地方的生命周期,但它实现了AsRef
特征。那么为什么书中有这个,而不是 Rust 中的实际代码呢?哪里可以找到书中提到的“一揽子实施”?
它没有被用在争论中as_ref
确实如此。该函数使用简写符号,可以扩展:
fn as_ref(&self) // becomes
fn as_ref(self: &Self) // becomes
fn as_ref(self: &&'a T)
也不与输出相关&U
Correct.
那么为什么书中有这个,而不是 Rust 中的实际代码呢?
Rust 每 6 周发布一次新的稳定版本。据推测这本书没有,所以他们很可能使用的是旧版本的 Rust。希望这本书能告诉你他们开发的版本。
As E_net4已经说明 https://stackoverflow.com/a/58030681/155423,要求指定'a
在这种情况下,Rust 1.31 中已被删除,如下所示记录在版本指南中 https://doc.rust-lang.org/edition-guide/rust-2018/ownership-and-lifetimes/lifetime-elision-in-impl.html.
您从书中提供的代码与此匹配在 Rust 1.30 中发现 https://github.com/rust-lang/rust/blob/1.30.0/src/libcore/convert.rs#L410-L415:
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 https://github.com/rust-lang/rust/blob/1.37.0/src/libcore/convert.rs#L494-L499:
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 周的开发时间,足以更改源代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)