Rust 通过初始化虚拟&;str,这样它就可以由函数填充

Rust 通过初始化虚拟&;str,这样它就可以由函数填充,rust,Rust,我的程序初始化一个变量“mag”,然后将它传递给一个函数,该函数根据int修改它 let n = some_number; let m = ""; x = foo(n, m); fn foo(n: u64, mut m: &str) -> &str { if n == 0 { m = "asdf"; } else { m = "qwerty"; return mag; } 然而,我得到一个编者的警告,杂志永远不会被

我的程序初始化一个变量“mag”,然后将它传递给一个函数,该函数根据int修改它

let n = some_number;
let m = "";
x = foo(n, m);

fn foo(n: u64, mut m: &str) -> &str {
    if n == 0 {
        m = "asdf";
    } else {
        m = "qwerty";
    return mag;
}

然而,我得到一个编者的警告,杂志永远不会被阅读。我不能返回在函数内部创建的变量,所以我必须在函数外部初始化mag。有更好的方法吗?

您不需要到处传递引用,您可以将局部变量的所有权传递到函数之外,没有问题
String
s如果您确实需要,也可以取消对
&str
的引用:

fn main() -> std::io::Result<()> {
    let n = 55;
    let x = foo(n);

    match &x[..] {
        "querty" => println!("Yep it was qwerty!"),
        _ => println!("Nope it wasn't qwerty :(")
    };

    Ok(())
}

fn foo(n: u64) -> String {
    if n == 0 {
        String::from("asdf")
    } else {
        String::from("querty")
    }
}
fn main()->std::io::Result{
设n=55;
设x=foo(n);
匹配&x[…]{
“querty”=>println!(“是的,是qwerty!”),
_=>println!(“不,不是qwerty:(”)
};
好(())
}
fn foo(n:u64)->字符串{
如果n==0{
字符串::from(“asdf”)
}否则{
字符串::from(“query”)
}
}
打印“是的,是qwerty!”

游乐场:


根据您的注释进行编辑以包括匹配。

在您的示例中,您返回的是静态字符串,因此可以执行以下操作:

fn foo(n: u64) -> &'static str {
    if n == 0 {
        "asdf"
    } else {
        "querty"
    }
}

你完全可以这样做,但是你需要传递一个可变的引用,而且你也不能改变
&str
的内容(如果这是你想要做的;
&str
本身是不可变的)。你只需要改变
m
指向另一个
&str
。这看起来毫无意义,因为
“asdf”和“qwerty”是静态的

fn main(){
让mut m:&str=“”;
foo(42岁及以上);
dbg!(m);
foo(0和m);
dbg!(m);
}
fn-foo(n:u64,m:&mut&str){
如果n==0{
*m=“asdf”;
}否则{
*m=“qwerty”;
}
}

我返回a&str的原因是,我然后根据foo的结果进行匹配。写起来似乎很枯燥。在“asdf”之后写“\u string()”,等等。我应该只写“\u string()”,然后在字符串上进行匹配而不是&str吗?我已经更新了我的答案。基本上,你可以将其切片并与a
&str
进行比较。