在 Rust 中是否可以指定匹配变量的生命周期?

4

例如:

enum FooBar {
  Bar(Vec<int>),
  Other
}

fn main() {
  let default:&[int] = [];
  let x = Bar(Vec::from_slice([1, 2, 3]));
  let y = match(x) {
    Bar(z) => z.slice(0, z.len()),
    _ => default
  };
  println!("{}", y);
}

在这个例子中,由于z的生命周期,切片无效;但是我们知道这里实际数据(x)在整个代码块中都是有效的。
是否有某种'a语法可用于帮助编译器?如果有,如何使用?
(我相信我以前见过类似'a match {}或match x'a {} / something语法,但现在找不到任何示例了)
1个回答

5
当然,代码中有一些语法,但它对生命周期的显式说明并不如你想象的那样,实际上更加通用。通过像你做的那样使用 match,你实际上把x移动到了匹配语句里,因此它被消耗了。难怪z.slice(...)无法跳出该块。但是你可以通过使用引用模式(注意在z前面的ref)来避免将x移入匹配语句:
let default: &[int] = [];
let x = Bar(vec![1, 2, 3]);
let y = match x {
    Bar(ref z) => z.slice(0, z.len()),
    Other => default
};
println!("{}", y);

这样,x 就不会被移动到匹配块中 - 它的内部将被借用。此程序编译并打印出 [1, 2, 3]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接