我有:
struct Id;
struct Url;
struct IdAndUrl {
id: Id,
url: Url,
}
Run Code Online (Sandbox Code Playgroud)
我希望能够IdAndUrl在我需要的地方使用Id.消除我可以使用的噪音impl Deref<Id> for IdAndUrl.
这是一个很好的做法/惯用语吗?
确实有贴近官方与相关指南Deref和DerefMut.根据C-DEREF从锈API方针,"只有智能指针实现Deref和DerefMut." 您的使用建议Deref会导致多个问题,因此未经强烈建议.
Deref没有类型参数,但是没有关联类型.实现它必须按照下面的代码完成,但永远不能实现其他属性.
// don't try this at home!
impl Deref for IdAndUrl {
type Target = Id;
fn deref(&self) -> &Self::Target { &self.id }
}
Run Code Online (Sandbox Code Playgroud)
此外,Deref实现通过deref强制从目标类型公开方法,使用您可能不希望在此处具有的接口污染结构.
人们可以看看其他转换特征(即From,AsRef和Borrow),看看它们是否有意义(C-CONV-TRAITS).但根据我的解释,这些都没有意义.正如在另一个答案中已经建议的那样,简单的吸气剂在这里是理想的
impl IdAndUrl {
fn id(&self) -> &Id { &self.id }
}
Run Code Online (Sandbox Code Playgroud)