我有:
struct Id;
struct Url;
struct IdAndUrl {
id: Id,
url: Url,
}
我希望能够使用 IdAndUrl
在我需要的地方 Id
.为了消除噪音,我可以使用 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
实现通过 deref 强制公开目标类型的方法,用您可能不想在此处拥有的接口(interface)污染结构。
可以查看其他转换特征(即 From
、AsRef
和 Borrow
)并查看它们是否有意义 (C-CONV-TRAITS) .但根据我的解释,这些都没有意义。正如另一个答案中已经建议的那样,一个简单的 setter/getter 在这里是理想的:
impl IdAndUrl {
fn id(&self) -> &Id { &self.id }
}
关于rust - 将 `Deref` 实现为返回复合结构的字段是惯用的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52771722/