我试图在一条小路上循环爬行,直到满足小路上的某个条件.要做到这一点似乎是一种有效的方法,那就是在每个循环中使用while let
循环将循环变量重新赋值为parent.
let path = std::path::Path::new("/my/long/path/to/a/file.txt");
while let Some(path) = path.parent() {
println!("{:?}", path);
if path_matches_condition(&path) {
println!("{:?} path matched", path);
break;
}
}
但是,这会导致无限循环,因为在LOOP语句中没有重新分配path
.
我本以为while let Some(path) = path.parent()
语句每次都会重新分配path
,但这并没有发生,path.parent()
的path
也没有改变.
即上述程序的输出将被重复"/my/long/path/to/a"
,直到该程序被手动终止.
这可以通过分离两个变量并在循环内手动重新赋值来解决.
let mut path = std::path::Path::new("/my/long/path/to/a/file.txt");
while let Some(parent) = path.parent() {
println!("{:?}", path);
if path_matches_condition(&path) {
println!("{:?} path matched", path);
break;
}
path = parent;
}
这是因为,尽管path.parent()
的path
和let Some(path)
的path
同名,但它们的作用域是分开的吗?你能详细解释一下我的误解吗?有没有更惯用的方式来做这类事情呢?