gpt4 book ai didi

loops - 为什么 `while let Some(variable) = ...` 不重新分配 `variable` ?

转载 作者:行者123 更新时间:2023-12-05 05:33:34 26 4
gpt4 key购买 nike

我试图在一个循环中爬上一条路径,直到满足路径上的某个条件。似乎一种有效的方法是使用 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;
}
}

但是,这会导致无限循环,因为 path没有在循环语句中重新赋值。

我会期待 while let Some(path) = path.parent()重新分配的语句 path每次,但这不会发生,并且 pathpath.parent()没有改变。即上面程序的输出将是 "/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;
}

发生这种情况是因为尽管 pathpath.parent()pathlet Some(path)有相同的名字,他们被范围分开?你能详细说明我的误解吗?有没有更惯用的方法来做这类事情?

最佳答案

你所做的和你所做的之间的显着差异the documentation确实,您从未重新分配 path - 但我认为您误解了它没有被重新分配的地方。

这个声明:

let path = ...
while let Some(p) = path.parent() { ... }

获取路径并调用parent()Some(p) 中的ppath 不是同一个变量。在您的代码中,当您放置 Some(path) 时,您正在隐藏外部范围的 path 变量。但是一旦第一个循环结束,阴影就会消失,并且您实际上并没有重新分配 path 值,因此 path.parent() 返回与之前相同的值.

因此,您可能需要:

let path = (...)
let parent_path = path.parent()
while let Some(p) = parent_path {
...
parent_path = p.parent();
}

注意阴影的发生是因为 let Some(p) = path.parent() 正在进行解构。与 match 语句非常相似 - 考虑以下代码:

fn main() {
let path: Option<&str> = Some("A path");
match path {
Some(path: &str) => println!("{:#?}", path),
None => println!("Nuthin!")
}
println!("{:#?}", path);
}

编译很干净,但我们可以清楚地看到第一个 path 是一个 Option,而内部是一个 &str。输出是:

"A path"
Some(
"A path",
)

关于loops - 为什么 `while let Some(variable) = ...` 不重新分配 `variable` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73793060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com