有条件地借用Rust,同时将值保持在范围内
我有一个可以接受切片的 Rust 函数,但也有一个默认值。然后,如果用户通过None,我想生成一个默认值。但是,因为我期望的数据类型是切片,所以我必须借用该默认值,但它立即超出了范围。考虑到添加条件总是会引入一个新的范围,一旦结束,该范围就会删除该值,我如何有条件地创建一个拥有的值然后借用它?
fn with_default(foo: usize, bar: Option<&[usize]>) {
let bar: &[usize] = match bar {
Some(s) => s,
None => {
let v: Vec<usize> = (0..foo).collect();
&v
}
};
}
&v
^^ borrowed value does not live long enough
}
^ `v` dropped here while still borrowed
let bar: &[usize] = match bar {
^^^ borrow later stored here
回答
受到Silvio Mayolo 的回答的启发,我意识到我可以Vec在顶级范围中声明,并且只能有条件地分配 + 借用它:
fn with_default(foo: usize, bar: Option<&[usize]>) {
let temp_vec: Vec<usize>;
let bar: &[usize] = match bar {
Some(s) => s,
None => {
temp_vec = (0..foo).collect();
&temp_vec
}
};
}
这是一个显示它按预期工作的操场链接:https : //play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3bd817cf2ffa10c131445c19be16cbfe