rust - 即使在 if let 语句之后,值仍然包含在 Option 中
问题描述
我有一个包含两个字段state和children的结构。子项是一个包含子项向量的选项。我正在使用 if let 语法将此选项解构回向量。
fn main() {
let mut root = Node::new2d(3);
loop {
root.calc_scores(100);
if let Some(mut children) = root.children {
let child = children.pop();
root = Node {
state: child.0,
children: None,
}
}
root.make_children();
}
}
struct Node<T> {
state: T,
children: Option<Vec<(T, i32)>>,
}
上面的代码无法编译。它抱怨 child 是 type Option<(Board2d,i32)>
。为什么孩子仍然被包裹在一个选项枚举中?不会if let Some(mut children) = root.children{}
将向量从 Option 枚举中取出吗?
解决方案
a 上的pop
方法Vec
返回 an Option
,因为Vec
实际可以是空的,因此 return None
,你也应该检查一下。
话虽如此,这Option<Vec<_>>
不是您经常需要的东西。只有当你真的想要一个空向量和根本没有向量之间的区别时才有意义,这似乎不是这里的情况。所以你最终会得到如下结果:
fn main() {
let mut root = Node::new2d(3);
loop {
root.calc_scores(100);
if let Some(child) = root.children.pop() {
root = Node {
state: child.0,
children: vec![],
}
}
root.make_children();
}
}
struct Node<T> {
state: T,
children: Vec<(T, i32)>,
}
推荐阅读
- reactjs - 当我的智能合约被批准时如何更改按钮的颜色
- python - 如何解决分配前引用的这个局部变量?
- reactjs - 在反应类型错误中:无法读取 null 的属性“销毁”
- amazon-web-services - 如何在 terraform 资源中的 zipmap 和列表上创建嵌套的 for 循环
- c# - SnmpSharpNet 示例面临的问题
- javascript - 直接在组件选择器上使用 Angular 动画不会影响组件的内容
- wso2 - WSO2 API 配置,查询参数到负载工厂到 json 到数据服务
- javascript - var 的计算值不影响反应中的饼图
- azure-devops - 基于 Azure YAML 的管道无法获取日期和 Rev:.r
- java - 如何在 Adpater 中使用 OnActivityResult 和 startIntentSenderForResult