Как уже говорили другие, проблема заключается в времени жизни и / или типе значений, помещаемых в карту клиентов.
customers.insert(key_value, vec);
| --------- borrow later used here
Часто это происходит, когда компилятор решил присвоить объекту тип что ты не ожидал. Чтобы выяснить, что он делает, вы можете вызвать тип и посмотреть, как он жалуется. Изменение кода на:
let mut customers: HashMap<(),()> = HashMap::new();
Дает нам две соответствующие ошибки:
20 | customers.insert(key_value, vec);
| ^^^^^^^^^ expected `()`, found `i32`
...
20 | customers.insert(key_value, vec);
| ^^^ expected `()`, found struct `std::vec::Vec`
|
= note: expected unit type `()`
found struct `std::vec::Vec<&str>`
Таким образом, тип, который компилятор хочет предоставить объекту наших клиентов, равен HashMap<i32, Vec<&str>>
Проблема в том, что время жизни &str
должно быть внутри блока, так как мы нигде не храним String
, и они не могут иметь время жизни 'static
, поскольку они введены пользователем.
Это означает, что мы, вероятно, хотим HashMap<i32,Vec<String>>
.
. Изменение кода для использования одного из них дает нам ошибку о том, что vec
не имеет нужного типа: он выводится как Vec<&str>
, но мы хотим Vec<String>
.
У нас есть два варианта.
Преобразуйте ve c в нужный тип непосредственно перед тем, как вставить его в карту, используя customers.insert(key_value, vec.iter().map(|s| s.to_string()).collect())
. (Хотя вы можете захотеть извлечь его из переменной для ясности).
Явно измените тип ve c на Vec<String>
Вариант 1 «просто работает». Хотя вариант 2 ведет нас по пути внесения аналогичных изменений все ближе и ближе к вызову read_line
.
Как только вы определились с исправлением в варианте 1, вы можете удалить добавленные вручную аннотации типов. разработать исправление, если вы найдете их слишком шумными.