Проблема заключается в гарантиях, которые Rust дает от вашего имени. Корень проблемы можно увидеть в следующем. Вы читаете файл и манипулируете его содержимым в HashMap
, и вы пытаетесь вернуть ссылку на прочитанные вами данные. Но, возвращая ссылку, вы должны будете гарантировать, что строки в файле не будут изменены позже, что вы, естественно, не можете сделать.
В терминах Rust вы продолжаете пытаться возвращать ссылки на локальные переменные, которые удаляются в конце функции, что эффективно оставит вас с висячими указателями. Вот изменения, которые я сделал, даже если они не самые эффективные, они компилируются.
fn myfunction(filename: &Path) -> io::Result<HashMap<String, String>> {
let mut SIF = HashMap::new();
let file = File::open(filename).unwrap();
let mut subset_description = "";
for line in BufReader::new(file).lines() {
let thisline = line?;
let line_split: Vec<String> = thisline.split("=").map(|s| s.to_string()).collect();
subset_description = if thisline.starts_with("a") {
let subset_description = line_split[1].trim();
subset_description
} else {
""
};
let subset_ids = if thisline.starts_with("b") {
let subset_ids = line_split[1].split(",");
let subset_ids = subset_ids.map(|s| s.trim());
subset_ids.map(|s| s.to_string()).collect()
} else {
Vec::new()
};
for k in subset_ids {
SIF.insert(k, subset_description.to_string());
println!("");
}
if thisline.starts_with("!dataset_table_begin") {
break;
}
}
Ok(SIF)
}
Как видите, теперь вы отдаете владение строками в возвращаемое значение. Это достигается путем изменения типа возвращаемого значения и использования функции to_string()
, чтобы передать владение локальными строками HashMap
.
Существует аргумент, что to_string()
медленный, поэтому вы можете изучить использование в или to_owned()
, но, поскольку я не разбираюсь в этих конструкциях, я не могу помочь вам в оптимизации.