Что вызывает это исключение «не может быть заимствовано»? - PullRequest
0 голосов
/ 28 февраля 2019

Почему выдается это исключение, и как я могу это исправить?Это кусок кода, над которым я работаю, чтобы получить пользовательский ввод.Я хочу использовать перечисления вместо операторов if else, но пока не понимаю, как реализовать перечисления достаточно хорошо.

use std::io;

fn main() {
    let version = String::from("0.0.1");
    let mut input = String::new();

    shell(&mut input, &version);
}

fn shell(input: &mut String, version: &String) {
    match io::stdin().read_line(&mut input) {
        Ok(b) => {
            if &input.trim() == &"ver" {
                println!("{}", &version);
            } else {
                println!("Command '{}' Not Recognized", &input);
                shell(&mut input, &version);
            }
        }
        Err(err) => panic!("incorrect"),
    }
}

1 Ответ

0 голосов
/ 28 февраля 2019

Сама переменная input не является изменяемой, она просто содержит изменяемую ссылку, поэтому вы не можете сделать изменяемую ссылку на нее.

Однако, поскольку это уже изменяемая ссылка, вы можете передать ее непосредственно в read_line, не ссылаясь на нее снова:

fn shell(input: &mut String, version: &String) {
    match io::stdin().read_line(input) {
        // already a &mut ref:  ^^^^^

Вы могли бы сделатьизменяемая переменная и повторно заимствовать ее:

fn shell(mut input: &mut String, version: &String) {
    //   ^^^
    match io::stdin().read_line(&mut input) {

Но это не должно быть необходимым.Это работает только из-за правил авторазмыкания в Rust, которые допускают, что такие вещи, как &&&&&&T, могут рассматриваться как &T в некоторых ситуациях.Это сделано для удобства, потому что многие универсальные функции возвращают ссылки на свои входные данные, и было бы беспорядочно разыменовывать все.

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