这是 Rust 中非常优雅的一个语法叫 while let 循环 ,专为" 在模式匹配成功时持续循环" 而设计。
让我们拆解这句话:
while let Some(node) = current {
// 只要 current 是 Some(node) 就会一直循环
// 每次循环中,node 就是 Unwrapped 后的值
}
等价于
loop {
match current {
Some(node) => {
// 处理 node
},
None => break, // 匹配不到就退出循环
}
}
在这段代码中的具体作用
while let Some(node) = current {
current = node.borrow().left.clone(); // 继续找左子节点
stack.push(node); // 将当前节点入栈
}
执行逻辑:
-
持续向左走:只要
current节点存在(Some),就继续循环 -
自动解包:
node自动获得Rc<RefCell<TreeNode>>值,无需手动unwrap() -
智能终止:当
current变为None时(左子树到底了),循环自动结束
为什么用 while let?
| 写法 | 缺点 |
|---|---|
while current.is_some() | 循环体内需要重复 unwrap(),不优雅 |
loop + match | 代码冗长,需要手动 break |
while let 将条件判断和值提取合二为一,更符合 Rust 的模式匹配哲学。
总结:在这个场景下,while let Some(node) = current 就是 "只要还有左子节点,就继续深入并收集路径上的所有节点" 的优雅表达。
4015

被折叠的 条评论
为什么被折叠?



