假设我有这个代码(它是人为的,因为它大大简化了):
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工作),但我似乎无法让它工作.我的问题只是它是否有效(以及如何)或者如果这里唯一的选择是使用宏.
Foo::Bar(ref mut v)
借用&mut Vec
从foo
所以它不能活得比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, } }