rust - 有条件地在 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
推荐阅读
- bash - 根据列表对路径更改的所有文件执行 mv
- sql-server - 将 MDX 查询转换为 SQL 查询
- c# - Xamarin 初始化顺序
- c++ - SDL2 窗口打开并保持无响应
- sql - 使用左连接时,如何呈现区分空字符串值和不存在值的数据?
- electron - 如何在开发中更改电子进程的名称?
- express - 错误处理程序无法与 nuxtjs 一起在 express 中正常工作
- python - 如何在没有 lambda 的行上使用 pandas 应用函数?
- android - Webview 进度对话框 NPObject 错误 - Android Studio
- django - 这打破了哪个规则/准则(向 orm 实例添加属性)