Значение по-прежнему заключено в опцию даже после оператора if let - PullRequest
0 голосов
/ 26 января 2020

У меня есть структура с двумя полями: state и children . Дети - это опция, которая содержит вектор детей. Я использую, если позволить синтаксису деконструировать эту опцию обратно в вектор.

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

Приведенный выше код не компилируется. Он жалуется, что ребенок относится к типу Option<(Board2d,i32)>. Почему ребенок все еще заключен в опцию enum? Разве if let Some(mut children) = root.children{} не убирает вектор из перечисления Option?

1 Ответ

5 голосов
/ 27 января 2020

Метод pop для Vec возвращает Option, поскольку Vec может фактически быть пустым и, таким образом, возвращать 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)>,
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...