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

时间:2014-05-05 05:46:34

标签: rust lifetime

例如:

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)对整个块都有效。

是否有一些'你可以在这里使用的语法来帮助提示这个编译器?如果是这样,你怎么做?

(我相信我过去曾见过某种'匹配{}或匹配x'a {} /某种语法,但我现在找不到任何例子,我正在寻找

1 个答案:

答案 0 :(得分:4)

当然,有一些语法,虽然它在生命中并不像你的意思那么明确,事实上它更为通用。通过执行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);

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