我有一个像
这样的结构struct Foo<'a> {
field1: &'a str,
field2: &'a str,
field3: &'a u8,
// ...
}
我用于从mmap
ped文件返回解析结果。对于一些成功的解析,我想存储结果以供稍后处理,并且由于各种原因,处理将在内存释放后发生。我可以做类似
struct OwnedFoo {
field1: String,
field2: String,
field3: Vec<u8>,
// ...
}
并手动将我感兴趣的所有Foo
转换为OwnedFoos
。但是我想知道我是否可以这样做:
struct Foo<'a> {
field1: Cow<'a, str>,
field2: Cow<'a, str>,
field3: Cow<'a, u8>,
...
}
相反,如果有任何方法可以自动使所有Cow
拥有并删除生命周期参数。我在图书馆文档中找不到任何适用的内容。
类似的东西:
let a = Foo { ... };
let a_owned = a.into_owned();
// do stuff with a_owned that I can't do with a
答案 0 :(得分:6)
构建基块:
Cow::into_owned
将返回自有版本。'static
是程序的生命周期因此我们可以编写一个实用函数:
use std::borrow::Cow;
fn into_owned<'a, B>(c: Cow<'a, B>) -> Cow<'static, B>
where B: 'a + ToOwned + ?Sized
{
Cow::Owned(c.into_owned())
}
您只需在所有字段上应用转换,即可将其展开为Foo<'a>
成为Foo<'static>
。