Я открываю файл CSV и читаю его, используя BufReader
и разбивая каждую строку на вектор. Затем я пытаюсь вставить или обновить счет в HashMap
, используя определенный столбец в качестве ключа.
let mut map: HashMap<&str, i32> = HashMap::new();
let reader = BufReader::new(input_file);
for line in reader.lines() {
let s = line.unwrap().to_string();
let tokens: Vec<&str> = s.split(&d).collect(); // <-- `s` does not live long enough
if tokens.len() > c {
println!("{}", tokens[c]);
let count = map.entry(tokens[c].to_string()).or_insert(0);
*count += 1;
}
}
Компилятор любезно сообщил мне, что s
недолговечен. Сохранение внутри цикла заимствованное значение для контейнера во внешней области? предполагает «владение» строкой, поэтому я попытался изменить
let count = map.entry(tokens[c]).or_insert(0);
to
let count = map.entry(tokens[c].to_string()).or_insert(0);
но я получаю ошибку
expected `&str`, found struct `std::string::String`
help: consider borrowing here: `&tokens[c].to_string()`
Когда я добавляю амперсанд (&
), возникает ошибка
creates a temporary which is freed while still in use
note: consider using a `let` binding to create a longer lived
В моих знаниях Rust о заимствованиях есть некоторый недостаток. Как я могу заставить хэш-карту владеть строкой, переданной в качестве ключа?
map
? - person Jmb   schedule 30.03.2020