我有一个看起来像这样的类型:
enum Name<'a> { Single(&'a str), Double(&'a str, &'a str), }
另一个非常相似的类型看起来像这样:
enum OwnedName { Single(String), Double(String, String), }
我已经有了一个将Name转换为OwnedName的方法.但是,我无法找到一种方法来实现像这样的类型Deref
或者Borrow
将OwnedName转换回Name.这意味着我必须两次编写相同的方法,这很烦人.我想要一些模仿方式PathBuf
/ Path
或String
/ 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
,这是完全可以理解的,因为它需要一生.但我不能提供一个.那么,有没有办法为我用Deref
,或Borrow
,或ToOwned
用这种方式?
没有办法做到这一点.
请注意,Deref::deref
它的签名表示它需要指向a的指针,其Name
生命周期与deref'ed相同.这样的值不存在.你也不能返回指向你在deref
函数中创建的东西的指针,因为它不可能比它自己的堆栈帧寿命更长.
根本问题在于它Name
基本上是一种不同类型的指针(就像*const T
是&T
),但是Deref
其他类似的特性只允许你返回借来的指针.目前,这只是没有办法解决这个问题.
但是,如果你不使用Deref
和其他类似的特性,你可以这样做.一种可能性是impl<'a> From<&'a OwnedName> for Name<'a>
.
我同意@DK.只要补充一点,如果您的想法是互换使用它们,您可能根本不需要OwnedName
.您可以定义Name以同时接受&str
和String
:
enum Namewhere T:Borrow { Single(T), Double(T, T), } // these both work now let _a1 = Name::Single("hello"); let _a2 = Name::Double(String::from("hello"), String::from("world"));