繁体   English   中英

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

[英]How can I implement Borrow, ToOwned, or Deref for an enum?

我有一个看起来像这样的类型:

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错误wrong number of lifetime parameters: expected 1, found 0type Target = Namewrong number of lifetime parameters: expected 1, found 0 ,这是完全可以理解的,因为它需要一生。 但我不能提供一个。 那么有没有办法以这种方式使用DerefBorrowToOwned

没有办法做到这一点。

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

最根本的问题是, Name基本上是一个不同类型的指针(如*const T&T ),但Deref和其他特质:它只是让你回借指针。 目前,这只是没有办法解决这个问题。

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

我同意@DK。 只是补充一点,如果您的想法是互换使用它们,您可能根本不需要拥有OwnedName 您可以定义Name以接受&strString

enum Name<T> where T:Borrow<str> {
    Single(T),
    Double(T, T),
}

// these both work now
let _a1 = Name::Single("hello");
let _a2 = Name::Double(String::from("hello"), String::from("world"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM