当前位置:  开发笔记 > 后端 > 正文

将可变引用的匹配放入函数时会出现生命周期问题

如何解决《将可变引用的匹配放入函数时会出现生命周期问题》经验,为你挑选了1个好方法。

假设我有这个代码(它是人为的,因为它大大简化了):

enum Foo<'a, T> where T: 'a {
    Bar(&'a mut Vec),
}

fn main() {
   let mut v = vec![1, 2];
   let foo: Foo = Foo::Bar(&mut v);
   let a = match foo {
       Foo::Bar(ref mut v) => &mut v[..],
   };
   a[1] = 10;
   println!("a = {:?}", a);
}

这很有效,每个人都很开心.但是,如果我尝试通过将match语句放在函数中来清理它,我甚至无法编译函数,更不用说让它为我工作了.我的许多尝试之一看起来像这样:

fn unpack<'a, T>(foo: Foo<'a, T>) -> &'a mut [T] {
    match foo {
        Foo::Bar(ref mut v) => &mut v[..],
    } 
}

我刚收到错误:

error: `foo.0` does not live long enough

我一直试图改变多个生命周期并添加一个where子句(就像我必须做的那样让Enum工作),但我似乎无法让它工作.我的问题只是它是否有效(以及如何)或者如果这里唯一的选择是使用宏.



1> Steven..:

Foo::Bar(ref mut v)借用&mut Vecfoo所以它不能活得比FOO(只住,直到函数的末尾).你真正想要做的是拿它(按价值)所以你应该匹配Foo::Bar(v):

fn unpack<'a, T>(foo: Foo<'a, T>) -> &'a mut [T] {
    match foo {
        Foo::Bar(v) => &mut v[..],
    } 
}

注意:Rust将v根据需要进行deref ,因此以下内容也适用:

fn unpack<'a, T>(foo: Foo<'a, T>) -> &'a mut [T] {
    match foo {
        Foo::Bar(v) => v,
    } 
}

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有