是什么导致这种“不能借用可变的”例外?

问题描述 投票:0回答:1

为什么会抛出此异常,以及如何解决它?这是我正在努力获取用户输入的一段代码。我想最终使用枚举而不是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"),
    }
}
reference rust mutability
1个回答
1
投票

变量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。这是为了方便,因为许多泛型函数返回对其输入的引用,并且必须解除引用所有内容而变得混乱。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.