将Cow字段转换为拥有的方便的方便方法

dna*_*naq 4 rust

我有一个结构定义像

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)

Mat*_* M. 7

建筑模块:

  • 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>通过简单地应用转换上的所有字段.