< 返回版块

Easonzero 发表于 2022-03-12 22:20

遇到个生命周期问题, 看起来只是一个表达式还是分成两个表达式的事, 着实不理解为何一个能编译通过, 一个不能, 求各位大佬不吝赐教

#[derive(Default)]
struct TrieTree {
    nodes: [Option<Box<TrieTree>>;26],
    is_tail: bool,
}

impl TrieTree {
    fn insert(&mut self, s: String) {
        let mut p = self;

        for i in s.bytes().map(|x| (x - b'a') as usize) {
            // 编译报错
            p = if let Some(trie_tree) = p.nodes[i].as_mut() {
                trie_tree
            } else {
                p.nodes[i] = Some(Default::default());
                p.nodes[i].as_mut().unwrap()
            };
            // 编译通过
            // if let Some(trie_tree) = p.nodes[i].as_mut() {
            //    trie_tree
            // } else {
            //    p.nodes[i] = Some(Default::default());
            //    p.nodes[i].as_mut().unwrap()
            // };
            // p = p.nodes[i].as_mut().unwrap();
        }
        p.is_tail = true;
    }
}

Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=33480a3c2041a24295353d8ca671d6a4

评论区

写评论
ooopSnake 2022-03-15 10:26

#[derive(Default)]
struct TrieTree {
    nodes: [Option<Box<TrieTree>>; 26],
    is_tail: bool,
}

impl TrieTree {
    fn insert(&mut self, s: String) {
        let mut p = self;
        for i in s.bytes().map(|x| (x - b'a') as usize) {
            // 这里改成模式匹配也是可以的
            match p.nodes[i] {
                Some(ref mut v) => {
                    p = v
                }
                None => {
                    p.nodes[i] = Some(Default::default());
                    p = p.nodes[i].as_mut().unwrap()
                }
            }
        }
        p.is_tail = true;
    }
}

作者 Easonzero 2022-03-13 21:24

感谢指教

--
👇
lan: 现在的借用检查器对控制流的分析还不够好,这在Niko的博客中有被提到。启用Polonius后就能够通过编译了。

github.com/shanliu/lsys 2022-03-13 13:06

这不是生命周期报错吧 可变借用

--
👇
Easonzero: 我知道这个写法, 主要是对这里的生命周期报错感到困惑

--
👇
苦瓜小仔: ```RUST s.bytes().map(|x| (x - b'a') as usize).for_each(|i| { p = p.nodes[i].get_or_insert_with(|| Default::default()); });



lan 2022-03-13 00:51

现在的借用检查器对控制流的分析还不够好,这在Niko的博客中有被提到。启用Polonius后就能够通过编译了。

作者 Easonzero 2022-03-12 22:58

我知道这个写法, 主要是对这里的生命周期报错感到困惑

--
👇
苦瓜小仔: ```RUST s.bytes().map(|x| (x - b'a') as usize).for_each(|i| { p = p.nodes[i].get_or_insert_with(|| Default::default()); });


苦瓜小仔 2022-03-12 22:48
s.bytes().map(|x| (x - b'a') as usize).for_each(|i| {
    p = p.nodes[i].get_or_insert_with(|| Default::default());
});
1 共 6 条评论, 1 页