如何操作 Rust env::args 并避免“借用时临时值丢失”?

ska*_*ori 4 rust

我不知道如何遵循编译器建议: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)

Mih*_*hir 9

#![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)

在您的代码中,在Somematch 的情况下,您正在创建一个拥有的String. 它会在匹配块的末尾被删除。

format!("./{}/**/*.liquid", a);
Run Code Online (Sandbox Code Playgroud)

这会产生 aString并且您返回对它的引用。

但在匹配块的末尾,String产生的format!()实际上已经下降,因此您试图返回一个悬空引用,因为编译器会拒绝您的代码。


“考虑使用 let 绑定来创建更长久的值”

简而言之,编译器建议您创建Stringbefore 并将其存储在某个位置,这样它就不会被删除,并且您能够返回有效的引用。

按照编译器的建议:

#![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()