【发布时间】:2015-10-15 23:09:57
【问题描述】:
我正在阅读有关 Rust 的 Deref 特征的文档:
pub trait Deref {
type Target: ?Sized;
fn deref(&self) -> &Self::Target;
}
deref 函数的类型签名对我来说似乎违反直觉;为什么返回类型是引用?如果引用实现了这个 trait 以便它们可以被取消引用,这会产生什么影响?
我能想到的唯一解释是引用没有实现Deref,但被认为是“原始可取消引用”。但是,如何编写适用于任何可解引用类型(包括Deref<T> 和&T)的多态函数呢?
【问题讨论】:
-
这可能会让你感兴趣reddit.com/r/rust/comments/2umad5/…
-
@JonasTepe 所以如果我理解正确,原因是我们不能指定返回左值的函数,所以我们通过返回对我们已经拥有的左值的引用来“手动”执行它?
-
您希望返回“正确”的左值。表示 self 拥有的值(Deref 的值实现者)。您不想返回一些短暂的左值。然后你也可以返回一个右值。这样做的唯一方法是将引用返回给 self。
-
@jco
*x不是所谓的deref,可以这么说。*x取消引用&-ptr。Deref允许不是对 pretend 的引用的对象作为引用,也就是。Box<T>可以像&T一样工作。见github.com/rust-lang/rfcs/blob/master/text/…。 -
如果特征被称为
AsRef,这可能不会那么混乱。不幸的是,我们已经有了这个名字的特征......