是什么导致此“无法借为可变借款”异常?

时间:2019-02-28 18:17:36

标签: reference rust mutability

为什么会引发此异常,我该如何解决?这是我正在努力获得用户输入的一段代码。我想最终使用枚举而不是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 :(得分: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的自动重新引用规则而起作用,该规则在某些情况下允许将&&&&&&T之类的内容视为&T。这样做很方便,因为许多泛型函数都返回对它们输入的引用,而不得不取消对所有内容的引用会很麻烦。