【发布时间】:2019-03-17 05:23:10
【问题描述】:
我有:
struct Id;
struct Url;
struct IdAndUrl {
id: Id,
url: Url,
}
我希望能够在我只需要Id 的地方使用IdAndUrl。为了消除噪音,我可以使用impl Deref<Id> for IdAndUrl。
这是一个好的做法/惯用语吗?
【问题讨论】:
标签: rust
我有:
struct Id;
struct Url;
struct IdAndUrl {
id: Id,
url: Url,
}
我希望能够在我只需要Id 的地方使用IdAndUrl。为了消除噪音,我可以使用impl Deref<Id> for IdAndUrl。
这是一个好的做法/惯用语吗?
【问题讨论】:
标签: rust
确实有与Deref 和DerefMut 相关的接近官方的指南。根据 Rust API 指南中的 C-DEREF,“只有智能指针实现 Deref 和 DerefMut。” 您使用 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 强制公开目标类型的方法,使用您可能不希望在此处拥有的接口污染结构。
可以查看其他转换特征(即From、AsRef 和Borrow),看看它们是否有意义(C-CONV-TRAITS)。但根据我的解释,这些都没有意义。正如另一个答案中已经建议的那样,一个简单的吸气剂在这里是理想的:
impl IdAndUrl {
fn id(&self) -> &Id { &self.id }
}
【讨论】:
Deref 的目的是实现指针类型。它应该将指向T 的指针转换为T,因此取消引用指针感觉“自然”。使用它在不相关的类型之间进行转换似乎令人困惑。
我建议你添加一个getter方法id()。
【讨论】: