首页 > 解决方案 > 有条件地在 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

标签: rust

解决方案


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


推荐阅读