实现`Deref`作为返回复合结构体中的字段是惯用语吗?

3

我有:

struct Id;
struct Url;
struct IdAndUrl {
    id: Id,
    url: Url,
}

我希望能够在只需要Id的地方使用IdAndUrl。为了消除噪音,我可以使用impl Deref<Id> for IdAndUrl
这是一个好的实践/惯用法吗?

3
https://github.com/rust-unofficial/patterns/blob/master/anti_patterns/deref.md - ozkriff
相关:https://dev59.com/xFcO5IYBdhLWcg3w5lbX - Boiethios
2个回答

6
确实有与 DerefDerefMut 相关的接近官方的指导方针。根据 Rust API 指南中的 C-DEREF"只有智能指针才实现 DerefDerefMut。" 您建议使用 Deref 将会导致多个问题,因此强烈不建议这样做。 Deref 没有类型参数,但有一个关联类型。实现它必须按照下面的代码进行,但不能为其他属性实现。
// don't try this at home!
impl Deref for IdAndUrl {
    type Target = Id;

    fn deref(&self) -> &Self::Target { &self.id }
}

此外,Deref 实现通过解引用强制转换公开了目标类型的方法,这会在结构体中污染一个你可能不想要的接口。
可以查看其他转换特征(即 FromAsRefBorrow),并看看它们是否有意义(C-CONV-TRAITS)。但根据我的理解,这些都没有意义。正如另一个答案已经建议的那样,在这里使用一个简单的 getter 是理想的解决方案。
impl IdAndUrl {
    fn id(&self) -> &Id { &self.id }
}

6
< p > Deref 的目的是实现指针类型。它应该将指向 T 的指针转换为 T,这样取消引用指针就感觉“自然”。在不相关的类型之间使用它似乎很令人困惑。< /p> < p > 我建议您添加一个 getter 方法 id()。< /p>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接