【问题标题】:Is it idiomatic to implement `Deref` as returning a field of a composite structure?将“Deref”实现为返回复合结构的字段是否惯用?
【发布时间】:2019-03-17 05:23:10
【问题描述】:

我有:

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

我希望能够在我只需要Id 的地方使用IdAndUrl。为了消除噪音,我可以使用impl Deref<Id> for IdAndUrl

这是一个好的做法/惯用语吗?

【问题讨论】:

标签: rust


【解决方案1】:

确实有与DerefDerefMut 相关的接近官方的指南。根据 Rust API 指南中的 C-DEREF“只有智能指针实现 DerefDerefMut。” 您使用 Deref 的建议会导致多个问题,因此强烈建议您使用 Deref。不建议。

Deref 没有类型参数,但有关联类型。必须按照下面的代码来实现它,但永远不能为其他属性实现。

// don't try this at home!
impl Deref for IdAndUrl {
    type Target = Id;

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

此外,Deref 实现通过 deref 强制公开目标类型的方法,使用您可能不希望在此处拥有的接口污染结构。

可以查看其他转换特征(即FromAsRefBorrow),看看它们是否有意义(C-CONV-TRAITS)。但根据我的解释,这些都没有意义。正如另一个答案中已经建议的那样,一个简单的吸气剂在这里是理想的:

impl IdAndUrl {
    fn id(&self) -> &Id { &self.id }
}

【讨论】:

    【解决方案2】:

    Deref 的目的是实现指针类型。它应该将指向T 的指针转换为T,因此取消引用指针感觉“自然”。使用它在不相关的类型之间进行转换似乎令人困惑。

    我建议你添加一个getter方法id()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-06
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多