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

Dou*_*oug 4 lifetime rust

例如:

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);
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,由于 z 上的生存期,切片无效;但我们知道这里的实际数据(x)对于整个块都是有效的。

您可以在此处使用一些语法来帮助向编译器提示这一点吗?如果是这样,你会怎么做?

(我相信我过去见过某种 'a match { } 或 match x 'a { } / some 语法,但现在我找不到任何示例)

Vla*_*eev 5

当然,有一些语法,尽管它在生命周期上并不像您所说的那么明确,而且实际上它更通用。通过match这样做,你实际上就进入x了比赛,所以它被消耗了。难怪z.slice(...)无法逃脱封锁。但是您可以x通过使用参考模式来避免进入比赛(请注意ref前面的内容z):

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);
Run Code Online (Sandbox Code Playgroud)

这种方式x不会移到匹配块中 - 它的内部结构是借用的。该程序编译并打印出[1, 2, 3].