是什么导致此 "cannot borrow as mutable" 异常?
What is causing this "cannot borrow as mutable" exception?
为什么会抛出这个异常,我该如何解决?这是我正在处理的一段代码,用于获取用户输入。我想最终使用枚举而不是 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"),
}
}
变量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
。这是为了方便,因为很多通用函数 return 引用了它们的输入,并且必须取消引用所有内容会变得混乱。
为什么会抛出这个异常,我该如何解决?这是我正在处理的一段代码,用于获取用户输入。我想最终使用枚举而不是 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"),
}
}
变量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
。这是为了方便,因为很多通用函数 return 引用了它们的输入,并且必须取消引用所有内容会变得混乱。