в настоящее время я пытаюсь изучить ржавчину. Я хотел создать очень небольшой и простой список задач, но у меня возникли некоторые проблемы с сопоставлением вводимых пользователем данных с различными параметрами.
Я уже пробовал разные решения из Интернета, но программа всегда попадает в ветку «нет совпадения» моего кода:
use std::io::{self, stdin};
fn main() {
let mut todo = Vec::new();
println!("--TODO LIST--");
println!("");
println!("1. Show List");
println!("2. Add to list");
println!("3. Remove from list");
let mut input = String::new();
let mut add = String::new();
stdin().read_line(&mut input).expect("cannot readline");
let mut i = 0;
let _= input.trim_end();
//println!();
//println!("{}", input);
match input.as_str() {
"1" => {
while i <= todo.len() {
print!("{}. {}", i, todo[i]);
i += 1;
}
},
"2" => {
println!("What do you want to add?");
io::stdin().read_line(&mut add).expect("Invalid answer");
todo.push( add);
},
"3" => {
println!("What do you want to remove (number)");
io::stdin().read_line(&mut add).expect("Invalid answer");
let my_int = add.parse::<usize>().unwrap();
todo.remove(my_int);
},
_=> {
println!("No Match");
main();
},
};
main();
}
let _= input.trim_end();
Кажется, вы ожидали, что trip_end() изменит строку на месте. Но это не так; он принимает &str
и возвращает &str
, который является частью оригинала, с удаленными пробелами в конце.
Так:
match input.trim_end() {
// ...
}
Глядя на документацию метода trim_end
:
pub fn trim_end(&self) -> &str
Возвращает фрагмент строки с удаленными конечными пробелами.
Вы можете внимательно прочитать подпись функции. В Rust ссылки по умолчанию не изменяемы. (См. главу «Владение» в официальной книге по ржавчине). Если бы функция использовала изменяемую ссылку, она была бы написана следующим образом:
pub fn trim_end(&mut self) -> &str
Поэтому мы уже знаем, что метод ни при каких обстоятельствах не может изменить строку на месте, а вернет новую &str
.
Вы можете написать код следующим образом:
let input = stdin().read_line(&mut input).expect("cannot readline");
let trimmed_input = input.trim_end()
match trimmed_input {
"1" => {}
"2" => {} // ...
}