我有几个 struct :
struct FileView{
name : String
path : String
//maybe other stuff
}
struct DirectoryView{
files : Vec<FileView>
//maybe other stuff
}
我想在DirectoryView的Iml中编写一个函数,该函数查找重复项(按名称),执行大约fs
个操作来删除其中一个路径,并更新DirectoryView以删除那里的重复项.
这很棘手,因为要移出共享引用的限制,将可变引用放入相同数据的多个点(如窗口函数),以及重复数据删除函数不允许我对要清除的重复项执行额外操作的事实.到目前为止,我能做的最好的事情是:
fn purge_duplicates(&mut self) {
self.files.sort_by(|a, b| a.name.cmp(&b.name));
let mut prev_name = "rumplestilskin";
let mut prev_path = "rumplestilskin";
self.files.iter_mut().for_each(|file| {
if file.name == prev_name {
file.name = "DELETE_ME".to_owned();
if file.path != prev_path {
std::fs::remove_file(&file.path).unwrap();
}
} else {
prev_name = &file.name;
prev_path = &file.path;
}
});
self.files.retain(|file| file.name != "DELETE_ME");
}
我不喜欢这样--神奇的"Lumplestilkin"和"Delete_ME"字符串,多次传球,都让我觉得乱七八糟.不过,我想出的其他 Select 至少也同样糟糕:
我可以为FileView
派生Clone
,使用窗口映射到一个全新的Vec<FileView>
,并将self.files
赋给它,但这感觉不太干净,只适用于可克隆的东西.
我可以标记要删除的文件的索引,然后以相反的顺序迭代这些索引.
我可能在心理上不明智,在文件视图被 destruct 时从磁盘上删除文件的方式实现了Drop
.我看到的唯一缺点是,为了获得类似的结果,它比把硬盘放在微波炉里要稍微多做一些工作.
有什么好办法可以做到这点吗?
作为一个额外的问题-我想要一个更好的方法来确保我只删除磁盘上的文件,如果保留的文件具有不同的路径.(即,我不想仅仅因为引用了两次就删除唯一的实际文件.)