我不知道如何遵循编译器建议: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"},
};
}
Run Code Online (Sandbox Code Playgroud)
#![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"},
};
}
Run Code Online (Sandbox Code Playgroud)
#![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",
};
}
Run Code Online (Sandbox Code Playgroud)
在您的代码中,在Some
match 的情况下,您正在创建一个拥有的String
. 它会在匹配块的末尾被删除。
format!("./{}/**/*.liquid", a);
Run Code Online (Sandbox Code Playgroud)
这会产生 aString
并且您返回对它的引用。
但在匹配块的末尾,String
产生的format!()
实际上已经下降,因此您试图返回一个悬空引用,因为编译器会拒绝您的代码。
“考虑使用 let 绑定来创建更长久的值”
简而言之,编译器建议您创建String
before 并将其存储在某个位置,这样它就不会被删除,并且您能够返回有效的引用。
按照编译器的建议:
#![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",
};
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个名为的变量,string
该变量将存在足够长的时间,并且您将String
生成的变量存储format!()
在string
. 然后您将引用返回到string
.
虽然更好的方法是在这里使用 aString
代替:
#![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());
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意,&str
您可以简单地做到dir.as_str()
。