传递初始化的哑元&str,以便可以由函数填充

时间:2019-05-01 02:40:09

标签: 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从未读过。我无法返回在函数内部创建的变量,因此必须在外部初始化mag。有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

您不需要传递引用,可以在函数外部传递局部变量的所有权,这没有问题。如果绝对需要String,也可以取消引用&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")
    }
}

打印“是的,很夸张!”。

游乐场:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=d7830c124171ab8a3c64f55a5c89590f

根据您的评论进行了编辑,包括匹配项。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您绝对可以做到这一点,但是您需要传递一个可变的引用,否则您将无法更改&str的内容(如果您打算这样做,{{ 1}}本身是不可变的。您只需更改&str即可指向另一个m。这似乎很有效,因为&str"asdf""qwerty" 'static s。

str

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f4bd325dd0e358aca8c9567db7bc0bd4