是什么导致了这种"cannot borrow as mutable"异常?



为什么要抛出这个异常,以及我如何修复它?这是我正在努力获取用户输入的一件代码。我最终想使用枚举而不是其他语句,但我不了解如何实现枚举。

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"),
    }
}

变量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的自动-DEREF规则而起作用的,该规则允许在某些情况下将&&&&&&T等事物视为&T。为方便起见,这是为了方便的,因为许多通用函数都会返回其输入的引用,因此必须消除所有内容。

相关内容

最新更新