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

时间:2017-02-10 08:57:54

标签: rust

我有一个像

这样的结构
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

1 个答案:

答案 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>