gpt4 book ai didi

rust - 借入时暂时值(value)下降

转载 作者:行者123 更新时间:2023-12-03 11:41:32 28 4
gpt4 key购买 nike

我不知道如何遵循编译器的建议:consider using a let binding to create a longer lived value
Playground

#![allow(unused)]
fn main() {
let a_dir=std::env::args().nth(2);

let dir:&str=match a_dir{
Some (ref a)=> &format!("./{}/**/*.liquid",a) as &str,
None=>{"./**/*.liquid"},
};
}
error[E0716]: temporary value dropped while borrowed
--> src/main.rs:6:23
|
5 | let dir:&str=match a_dir{
| --- borrow later stored here
6 | Some (ref a)=> &format!("./{}/**/*.liquid",a) as &str,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
| |
| creates a temporary which is freed while still in use
|
= note: consider using a `let` binding to create a longer lived value

最佳答案

#![allow(unused)]
fn main() {
let a_dir = std::env::args().nth(2);

let dir: &str = match a_dir {
Some(ref a) => &format!("./{}/**/*.liquid", a) as &str,
None => "./**/*.liquid",
};
}
在您的代码中,在match的 Some案例中,您正在创建一个拥有的 String。匹配块末尾将删除该块。
format!("./{}/**/*.liquid", a);
这将产生一个 String ,并且您返回对它的引用。
但是在match块的末尾, String生成的 format!()实际上已经删除了,因此您试图返回一个悬空引用,因为哪个编译器拒绝了您的代码。

"consider using a let binding to create a longer lived value"


简而言之,编译器建议您先创建 String并将其存储在某个位置,以便它不会被丢弃,并且能够返回有效的引用。
按照编译器的建议:
#![allow(unused)]
fn main() {
let a_dir = std::env::args().nth(2);

let string;
let dir: &str = match a_dir {
Some(ref a) => {
string = format!("./{}/**/*.liquid", a);
&string
},
None => "./**/*.liquid",
};
}
这将创建一个名为 string的变量,该变量的生命周期将足够长,并将您从 String生成的 format!()存储在 string中。然后,将引用返回给 string
尽管更好的方法是在此处使用 String:
#![allow(unused)]
fn main() {
let a_dir = std::env::args().nth(2);

let dir = a_dir
.as_ref()
.map(|val| format!("./{}/**/*.liquid", val))
.unwrap_or_else(|| "./**/*.liquid".to_string());
}
如果您想要 &str,则只需执行 dir.as_str()即可。

关于rust - 借入时暂时值(value)下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64952184/

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