Сама переменная 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
в некоторых ситуациях.Это сделано для удобства, потому что многие универсальные функции возвращают ссылки на свои входные данные, и было бы беспорядочно разыменовывать все.