为什么会抛出此异常,以及如何解决它?这是我正在努力获取用户输入的一段代码。我想最终使用枚举而不是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的自动deref规则允许像&&&&&&T
这样的东西在某些情况下被视为&T
。这是为了方便,因为许多泛型函数返回对其输入的引用,并且必须解除引用所有内容而变得混乱。