例如:
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 {} /某种语法,但我现在找不到任何例子,我正在寻找
答案 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]
。