Передача инициализированной dummy & str, чтобы она могла быть заполнена функцией - PullRequest
0 голосов
/ 01 мая 2019

Моя программа инициализирует переменную "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 голосов
/ 02 мая 2019

В вашем примере вы возвращаете статические строки, так что вы можете сделать это:

fn foo(n: u64) -> &'static str {
    if n == 0 {
        "asdf"
    } else {
        "querty"
    }
}
0 голосов
/ 02 мая 2019

Вы, безусловно, можете это сделать, но вам нужно передать изменяемую ссылку, также вы не сможете изменить содержимое &str (если это то, что вы собираетесь делать; &str являютсяНеизменен в этом сам).Вы просто изменили бы m, чтобы указать на другое &str.Кажется, это работает, потому что "asdf" & "qwerty" являются 'static str s.

fn main() {
    let mut m = "";

    foo(42, &mut m);
    dbg!(m);

    foo(0, &mut m);
    dbg!(m);
}

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

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

0 голосов
/ 01 мая 2019

Вам не нужно передавать ссылку, вы можете передать владение локальной переменной за пределы функции, без проблем.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")
    }
}

Печатает "Да, это было qwerty!".

Детская площадка: https://play.rust -lang.org/?version=stable&mode=debug&edition=2018&gist=d7830c124171ab8a3c64f55a5c89590f

Отредактировано для включения соответствия согласно вашему комментарию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...