例如:
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 语法,但现在我找不到任何示例)
当然,有一些语法,尽管它在生命周期上并不像您所说的那么明确,而且实际上它更通用。通过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]
.
归档时间: |
|
查看次数: |
980 次 |
最近记录: |