我有一个结构定义像
struct Foo<'a> {
field1: &'a str,
field2: &'a str,
field3: &'a u8,
// ...
}
Run Code Online (Sandbox Code Playgroud)
我用来从mmapped文件返回解析结果.对于一些成功的解析,我想存储结果以供稍后处理,并且由于各种原因,处理将在内存释放后发生.我可以做点什么
struct OwnedFoo {
field1: String,
field2: String,
field3: Vec<u8>,
// ...
}
Run Code Online (Sandbox Code Playgroud)
并手动转换Foo我感兴趣的所有内容OwnedFoos.但是我想知道我是否可以这样做:
struct Foo<'a> {
field1: Cow<'a, str>,
field2: Cow<'a, str>,
field3: Cow<'a, u8>,
...
}
Run Code Online (Sandbox Code Playgroud)
相反,如果有任何方法可以自动使所有Cows拥有并擦除生命周期参数.我没有在图书馆文档中找到任何适用的内容.
就像是:
let a = Foo { ... };
let a_owned = a.into_owned();
// do stuff with a_owned that I can't do with a
Run Code Online (Sandbox Code Playgroud)
建筑模块:
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())
}
Run Code Online (Sandbox Code Playgroud)
您可以扩大这Foo<'a>成为Foo<'static>通过简单地应用转换上的所有字段.