rust - 这个“As lifts over &” AsRef impl 是什么意思?
问题描述
在调试(步入)这个 Rust 代码时:
use std::fs;
fn main() {
fs::create_dir("my_dir").unwrap();
}
我去了一个我很难理解的 impl:
// rustup\toolchains\stable-x86_64-pc-windows-gnu\lib\rustlib\src\rust\library\core\src\convert\mod.rs
// As lifts over &
#[stable(feature = "rust1", since = "1.0.0")]
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)
}
}
然后调用:
#[stable(feature = "rust1", since = "1.0.0")]
impl AsRef<Path> for str {
#[inline]
fn as_ref(&self) -> &Path {
Path::new(self)
}
}
这个“As lifts over &” impl 是什么意思?为什么需要它?
这段代码:
<T as AsRef<U>>
我以前从未见过这种语法。这是什么意思?
似乎有很多像这样的隐式转换是由 Rust 编译器在我们日常的 Rust 代码背后完成的。除了调试还有什么方法可以学习它们吗?
解决方案
我假设As lifts over &
只是意味着 ifT
可以作为对 的引用U
,所以也可以&T
,因为为什么不呢?
它也提供了一些便利,例如,如果你碰巧有一个 type 的值&&&&&&T
,你就不需要了(******t).as_ref()
,它只是t.as_ref()
,因为通过使用这样的实现,as_ref
遍历T
对象本身的所有级别的引用并将其作为引用到U
.
你怎么能学呢?嗯,前 3 名最受欢迎的 Rust 教科书以某种方式有它(不一定明确地向你解释这个特殊情况,但会给你足够的知识来隐含地理解它们。所以我建议你阅读一本(并且更仔细地阅读)。
关于<T as AsRef<U>>
,它肯定在书中有所介绍。需要消除对函数的调用的歧义。例如,如果某个类型实现了两个不同的特征,但两个特征具有相同的方法as_ref
,那么您需要完全限定您要调用的特征的函数,为此您<T as AsRef<U>>
可以立即清楚as_ref
您调用的是哪个函数。
推荐阅读
- python - 在熊猫数据框中查找到下一个更高值的距离
- r - 将列表列表转换为小标题
- excel - 如何确定变量的先前值?
- javascript - 重命名 webpack/gatsby 块映射字符串
- python - 在 Pandas Python 中折叠列中的一些行
- linq - 使用 linq 在多对多表中进行计数
- google-app-engine - 谷歌应用引擎阻止两个服务之间的 OPTIONS 请求
- javascript - 使用javascript在浏览器中从数组中显示一行随机图片
- python-3.x - 如何将 ImageTk 转换为图像?
- javascript - 在 Laravel 中使用 Ajax 将数据从视图传递到控制器