将"Deref"实现为返回复合结构的字段是不是惯用?

dpc*_*.pw 2 rust

我有:

struct Id;
struct Url;
struct IdAndUrl {
    id: Id,
    url: Url,
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sve*_*ach 6

目的Deref是实现指针类型.它应该将指针转换TT,所以取消引用指针感觉"自然".使用它来转换不相关的类型似乎令人困惑.

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


E_n*_*ate 6

确实有贴近官方与相关指南DerefDerefMut.根据C-DEREF从锈API方针,"只有智能指针实现DerefDerefMut." 您的使用建议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,AsRefBorrow),看看它们是否有意义(C-CONV-TRAITS).但根据我的解释,这些都没有意义.正如在另一个答案中已经建议的那样,简单的吸气剂在这里是理想的

impl IdAndUrl {
    fn id(&self) -> &Id { &self.id }
}
Run Code Online (Sandbox Code Playgroud)