我的类型如下:
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
吗?
答案 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