Ich habe versucht, eine Datei auf eine Weise zu lesen, die für meinen Zweck performant genug ist. Ich habe eine Liste von Datei-IDs, Namen und Zeilenindizes (geordnet) und für jedes Paar (file_id, file_name, line_index)
muss ich die Datei öffnen, finde die Zeile nach Index und drucke.Mutieren von zwei abhängigen Werten in Schleife
Um leistungsfähiger zu sein (ich weiß, die Eingabe ist bestellt) Ich möchte die BufReader
, die Zeile für Zeile liest und die Datei offen bleiben lassen, wenn möglich.
fn main() {
// positions in file
// structure: (file_id, file_name, line_index_in_file)
let positions = &vec![
(1, String::from("file1"), 1),
(1, String::from("file1"), 2),
(1, String::from("file1"), 20),
(2, String::from("file2"), 15)];
print_lines_from_file(&positions);
}
fn print_lines_from_file(found: &Vec<(i32, String, i32)>) {
let mut last_file_id = -1;
//let mut last_file_name = None;
let mut open_file = None;
let mut open_reader = None;
for &(file_id, ref file_name, pos_in_file) in found {
println!("{} {}", file_id, pos_in_file);
if last_file_id < file_id {
last_file_id = file_id;
//last_file_name = file_ids.get(&file_id);
if let Some(to_close) = open_file {
drop(open_reader.unwrap());
drop(to_close);
}
//let file = File::open(last_file_name.unwrap()).unwrap();
let file = File::open(file_name).unwrap();
open_file = Some(file);
open_reader = Some(BufReader::new(&file));
}
// use reader to find the line in file and process
}
}
Ich bin mit diesem Problem konfrontiert:
main.rs:40:48: 40:52 error: `file` does not live long enough
main.rs:40 open_reader = Some(BufReader::new(&file));
main.rs:40:48: 40:52 error: use of moved value: `file` [E0382]
main.rs:40 open_reader = Some(BufReader::new(&file));
Es ist offensichtlich, (file
‚s Lebensdauer sehr kurz ist), aber ich weiß nicht, wie es zu umgehen. Die BufReader
hängt von File
ab, aber ich muss die File
später in der Schleife schließen, wenn sich file_id
ändert.
Auch fühle ich mich nicht sehr bequem drop
Aufruf so in Schleife, wie es mir aussieht, wie ich versuche, den Compiler zu täuschen. Ist dieser Ansatz in Ordnung?
Bitte auch wenn Sie bessere Lösung kennen (z. B. wie Sie die Datei über BufReader
schließen, würde ich mich über den allgemeinen Einblick freuen, wie Sie es lösen können).
Die explizite 'drop' ist nicht erforderlich, es scheint. – Shepmaster
@Shempmaster: aber es ist expliziter, deshalb habe ich es aufgenommen. Alternativ könnte man einen Kommentar hinzufügen, der die Absicht angibt ... Was wahrscheinlich besser ist :) –
Ich habe den Text bearbeitet, um einen Kommentar anstelle des 'drop' einzufügen. –