首页 > 解决方案 > 即使在 if let 语句之后,值仍然包含在 Option 中

问题描述

我有一个包含两个字段statechildren的结构。子项是一个包含子项向量的选项。我正在使用 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 枚举中取出吗?

标签: rust

解决方案


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)>,
}

推荐阅读