2017-02-10 29 views
3

我有一个像与牛田改造结构方便的方式来拥有

struct Foo<'a> { 
    field1: &'a str, 
    field2: &'a str, 
    field3: &'a u8, 
    // ... 
} 

,我使用的从mmap PED文件返回解析结果定义的结构。对于一些成功的解析,我想存储结果以供以后处理,并且由于各种原因,在释放内存后进行处理。我可以做类似

struct OwnedFoo { 
    field1: String, 
    field2: String, 
    field3: Vec<u8>, 
    // ... 
} 

,并手动将所有Foo s表示我有兴趣到OwnedFoos。不过,我想知道如果我可以这样做:

struct Foo<'a> { 
    field1: Cow<'a, str>, 
    field2: Cow<'a, str>, 
    field3: Cow<'a, u8>, 
    ... 
} 

代替,如果有任何的方式来自动使所拥有的所有的Cow S和擦除寿命参数。我在库文档中没有发现任何似乎适用的内容。

喜欢的东西:

let a = Foo { ... }; 
let a_owned = a.into_owned(); 
// do stuff with a_owned that I can't do with a 
+0

在你的例子中,'a_owned'的类型是什么?你也想让它成为'Foo'吗? –

+0

我很喜欢它是一个'Foo',它的使用寿命参数已被删除,但更多的是我感兴趣的使用人体工程学,即不必定义新的类型。 – dnaq

回答

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>

+0

您是否知道是否有任何方法可以为Foo定义IntoOwned,以便foo.into_owned()将返回Foo <'static>? – dnaq

+1

@dnaq:当然,你只需要两个实现:'impl <'a>借用>为Foo <'static>',然后'impl <'a> Tooowned for Foo <'a> {type Owned = Foo <'static>; }' –

+0

似乎我不能为'借用'添加该实现,因为特征边界冲突。我猜想'impl <'a>借用>对于Foo <'static>'的实例化'其中'a =='静态是问题。 – dnaq

相关问题