gpt4 book ai didi

rust - Rust引用Vec当前函数错误拥有的数据

转载 作者:行者123 更新时间:2023-12-03 11:34:42 25 4
gpt4 key购买 nike

我正在编写代码以解析CLI参数,并停留在一个非常常见的Rust错误上。
有什么变化(理想情况下,无需将所有内容分配给各个let变量,我需要进行修复以解决编译错误吗?
我一直在看很多类似的文章,并重新增加了 rust 书中的所有权一章。但是我还没有找到针对我的具体情况的解决方案。
我解析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)
  • 将每个方法调用的结果分配给一个变量(请参见上面的args2args_vecargs_slice)
  • 使参数args: env::Args成为new函数的引用(&)

  • 据我了解,问题在于 result引用了一个/所有args变量,这些变量超出范围并在 new将来依赖的 result方法的末尾删除。

    最佳答案

    match提供Ok(Config::WorldDef { ... dead_char: Some(&d), alive_char: Some(&a), }时,最后两个引用是String拥有的args_vec的切片
    (通过args_slice访问)。
    当函数退出时,args_vec不再存在,因此如果Rust不提示,结果中的引用将晃晃。
    我建议您在String&str成员中存储dead_char而不是alive_char;这样,结果可以将它们的所有权带给args_vec的字符串。
    顺便说一句,如果您这样做的话,我不确定args_slice是有用的。我认为您可以只在args_vec语句中使用match,因为此后将不再使用它。

    关于rust - Rust引用Vec当前函数错误拥有的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66100308/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com