如何为枚举实现Borrow,ToOwned或Deref?

时间:2015-12-31 07:21:34

标签: enums rust

我的类型如下:

enum Name<'a> {
    Single(&'a str),
    Double(&'a str, &'a str),
}

另一个非常相似的类型:

enum OwnedName {
    Single(String),
    Double(String, String),
}

我已经有了一个将Name转换为OwnedName的方法。但是,我无法找到一种方法来为此类型实现类似DerefBorrow的内容,以将OwnedName转换回Name。这意味着我必须两次编写相同的方法,这很烦人。我希望能够模仿PathBuf / PathString / str的工作方式。我尝试过这样的事情:

impl ops::Deref for OwnedName {
    type Target = Name;

    fn deref(&self) -> &Name {
        match *self {
            OwnedName::Single(ref s) => Name::Single(&**s),
            OwnedName::Double(ref s1, ref s2) => Name::Double(&**s1, &**s2),
        }
    }
}

wrong number of lifetime parameters: expected 1, found 0 type Target = Name上的这个错误,这是完全可以理解的,因为它需要一生。但我不能提供一个。那么我有办法以这种方式使用DerefBorrowToOwned吗?

2 个答案:

答案 0 :(得分:5)

没有办法做到这一点。

请注意,Deref::deref的签名表示它需要一个指向Name的指针,其生命周期与deref'ed相同。这样的值不存在。你不能返回指向你在deref函数中创建的东西的指针,因为它不可能比它自己的堆栈帧寿命更长。

根本问题是Name基本上是一个不同的指针(如*const T&T),但是Deref和像这样的其他特性允许你返回借来的指针。目前,这还没有办法解决这个问题。

但是,如果您不使用Deref和其他类似特征,则可以这样做。一种可能性是impl<'a> From<&'a OwnedName> for Name<'a>

答案 1 :(得分:5)

我同意@DK。只是补充一点,如果您的想法是互换使用它们,您可能根本不需要URL GOTO=https://www.kijiji.ca/p-post-ad.html?categoryId=168 TAG POS=1 TYPE=BUTTON FORM=ACTION:/p-submit-ad.html ATTR=TXT:Select<SP>Images TAG POS=1 TYPE=INPUT:FILE FORM=ACTION:/p-submit-ad.html ATTR=* CONTENT=D:\images\download.jpg WAIT SECONDS=1 。 您可以定义名称以接受OwnedName&str

String