【发布时间】:2021-02-08 10:59:20
【问题描述】:
我正在编写代码来解析 CLI 参数,但遇到了一个非常常见的 Rust 错误。
什么更改(理想情况下不需要将所有内容分配给单个 let 变量,我需要进行哪些更改来修复编译错误?
我一直在查看很多类似的帖子,并重新阅读了 rust book 中关于所有权的章节。但是我还没有找到针对我的具体情况的解决方案。
我解析args的代码如下:
The full file on github is here:
pub fn new<'a>(
args: env::Args,
default_world_def: Config<'static>,
presets: Vec<&'static str>,
) -> Result<Config<'a>, String> {
let args2 = args;
let args_vec = args2.collect::<Vec<String>>();
let args_slice = args_vec.as_slice();
let result = match args_slice {
[_, preset] => {
if preset == "help" {
Err(format!(
"try: gol
try: gol {:?}
try: gol [width height num_starting_cells seed display_dead display_alive] (e.g: gol 40 40 40 4045)",
presets
))
} else if presets.contains(&&preset[..]) {
Ok(Config::Preset {
key: preset.to_string(),
})
} else {
Err(format!("Unknown preset, choose from {:?}.", presets))
}
}
[_] => Ok(default_world_def),
[_, w, h, n, s] => {
let (width, height, num_starting_cells, seed) = Config::parse_args(&w, &h, &n, &s)?;
Ok(Config::WorldDef {
width,
height,
num_starting_cells,
seed,
dead_char: None,
alive_char: None,
})
}
[_, w, h, n, s, d, a] => {
let (width, height, num_starting_cells, seed) = Config::parse_args(&w, &h, &n, &s)?;
Ok(Config::WorldDef {
width,
height,
num_starting_cells,
seed,
dead_char: Some(&d),
alive_char: Some(&a),
})
}
args => Err(format!(
"Expected at least 4 or 6 args but got {}",
args.len() - 1
))
};
result
这会导致错误:
error[E0515]: cannot return value referencing local variable `args_vec`
--> src/config.rs:77:9
|
27 | let args_slice = args_vec.as_slice();
| -------- `args_vec` is borrowed here
...
77 | result
| ^^^^^^ returns a value referencing data owned by the current function
我试过了:
- 修改生命周期参数(做更多事情
static) - 将每个方法调用的结果分配给一个变量(参见上面的
args2、args_vec和args_slice) - 使
args: env::Args函数的参数new成为引用(&)
据我了解,问题是 result 引用了一个/所有 args 变量,这些变量超出范围并在 new 方法的末尾被删除,@987654335 @未来依赖。
【问题讨论】:
-
会的!我还将发布一个完整文件的 github 链接。
标签: rust