我有:
struct Id;
struct Url;
struct IdAndUrl {
id: Id,
url: Url,
}
我希望能够在只需要
Id
的地方使用IdAndUrl
。为了消除噪音,我可以使用impl Deref<Id> for IdAndUrl
。这是一个好的实践/惯用法吗?
我有:
struct Id;
struct Url;
struct IdAndUrl {
id: Id,
url: Url,
}
Id
的地方使用IdAndUrl
。为了消除噪音,我可以使用impl Deref<Id> for IdAndUrl
。Deref
和 DerefMut
相关的接近官方的指导方针。根据 Rust API 指南中的 C-DEREF,"只有智能指针才实现 Deref
和 DerefMut
。" 您建议使用 Deref
将会导致多个问题,因此强烈不建议这样做。
Deref
没有类型参数,但有一个关联类型。实现它必须按照下面的代码进行,但不能为其他属性实现。// don't try this at home!
impl Deref for IdAndUrl {
type Target = Id;
fn deref(&self) -> &Self::Target { &self.id }
}
Deref
实现通过解引用强制转换公开了目标类型的方法,这会在结构体中污染一个你可能不想要的接口。From
,AsRef
和 Borrow
),并看看它们是否有意义(C-CONV-TRAITS)。但根据我的理解,这些都没有意义。正如另一个答案已经建议的那样,在这里使用一个简单的 getter 是理想的解决方案。impl IdAndUrl {
fn id(&self) -> &Id { &self.id }
}