Pointers 为什么Deref::Deref本身的返回类型是引用?

Pointers 为什么Deref::Deref本身的返回类型是引用?,pointers,reference,rust,Pointers,Reference,Rust,我在看Rust的特征文件: deref函数的类型签名对我来说似乎违反直觉;为什么返回类型是引用?如果引用实现了这一特性以便可以取消引用,那么这会有什么影响 我能给出的唯一解释是引用不实现Deref,而是被认为是“原始的可去引用的”。然而,对于任何可解引用类型,包括Deref和&T,如何编写多态函数呢?编译器只知道如何解引用和指针,但它也知道实现Deref特征的类型有一个Deref()方法,该方法可用于获取对给定对象内部某物的适当引用。如果取消引用一个对象,实际上要做的是首先获取引用,然后才取消引

我在看Rust的特征文件:

deref
函数的类型签名对我来说似乎违反直觉;为什么返回类型是引用?如果引用实现了这一特性以便可以取消引用,那么这会有什么影响


我能给出的唯一解释是引用不实现
Deref
,而是被认为是“原始的可去引用的”。然而,对于任何可解引用类型,包括
Deref
&T
,如何编写多态函数呢?

编译器只知道如何解引用和指针,但它也知道实现
Deref
特征的类型有一个
Deref()
方法,该方法可用于获取对给定对象内部某物的适当引用。如果取消引用一个对象,实际上要做的是首先获取引用,然后才取消引用它

如果
deref()

引用不实现
Deref

您可以看到,
&T
在该列表中:

impl<'a, T> Deref for &'a T where T: ?Sized
错误[E0308]:类型不匹配
-->src/main.rs:5:17
|
5 |设:()=Deref::Deref(&s);
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
=注意:应为类型“”()`
找到类型“%str”`
错误[E0308]:类型不匹配
-->src/main.rs:6:17
|
6 |设u:()=*s;
|^^应为(),找到str
|
=注意:应为类型“”()`
找到'str'类型`
显式调用
deref
返回一个
&str
,但是操作符
*
返回一个
str
。这更像是调用
*Deref::Deref(&s)
,忽略隐含的无限递归

如果
deref
返回一个值,它要么是无用的,因为它总是移出,要么是语义与其他所有函数截然不同

虽然“无用”有点强;它对于实现
Copy
的类型仍然有用

另见:


请注意,对于
Index
IndexMut
而言,上述所有内容都是有效的。

这可能会引起@JonasTepe的兴趣,因此如果我理解正确,原因是我们无法指定返回左值的函数,因此我们“手动”执行此操作通过返回对我们已有的左值的引用,您可能希望返回“正确”的l值。指自我拥有的价值(Deref的价值实现者)。你不会想要返回一些短暂的左值。那么你也可以返回一个右值。唯一的方法是将引用返回到self中。@jco
*x
可以说不是调用
deref
<代码>*x
解除对
&
-ptr的引用
Deref
允许非引用的对象假装为引用,即<代码>框可以像
&T
一样工作。请参阅。如果该特征被称为
AsRef
,则可能不会那么容易混淆。不幸的是,我们已经有了这个名字的特征。。。
impl<'a, T> Deref for &'a T where T: ?Sized
use std::ops::Deref;

fn main() {
    let s: String = "hello".into();
    let _: () = Deref::deref(&s);
    let _: () = *s;
}