я разбираю это
[xxxxx]
drive0={}
drive1={path="xxxx"}
...
иногда есть путь, иногда нет.
У меня есть рабочий код, но я все еще пытаюсь изучить идиоматический способ работы с ржавчиной. Код:
for i in 0..8 {
let drive_name = format!("drive{}", i);
if dmap.contains_key(&drive_name) {
if let Some(d) = config[drive_name].as_table() {
this.units.push(Rkunit::new(true));
if d.contains_key("path") {
if let Some(path) = d["path"].as_str() {
let file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open(path)
.unwrap();
this.units[i].file.replace(file);
}
}
} else {
this.units.push(Rkunit::new(false));
}
}
}
Я ожидал, что
if let Some(path) = d["path"].as_str()
(т.е. без строки if d.contains()
)
будет иметь дело с обоими случаями - т.е. нет пути и путь не является строкой, но это не так. То же самое и с contains_key(drive_name)
.
Я пробовал различные угадываемые синтаксисы, чтобы увидеть, смогу ли я избежать другого вложенного if и смогу ли найти его.
Так есть ли лучший способ или это так же хорошо, как и получается. Любые другие комментарии по разбору toml приветствуются.