遇到个生命周期问题, 看起来只是一个表达式还是分成两个表达式的事, 着实不理解为何一个能编译通过, 一个不能, 求各位大佬不吝赐教
#[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
1
共 6 条评论, 1 页
评论区
写评论感谢指教
--
👇
lan: 现在的借用检查器对控制流的分析还不够好,这在Niko的博客中有被提到。启用Polonius后就能够通过编译了。
这不是生命周期报错吧 可变借用
--
👇
Easonzero: 我知道这个写法, 主要是对这里的生命周期报错感到困惑
--
👇
苦瓜小仔: ```RUST s.bytes().map(|x| (x - b'a') as usize).for_each(|i| { p = p.nodes[i].get_or_insert_with(|| Default::default()); });
现在的借用检查器对控制流的分析还不够好,这在Niko的博客中有被提到。启用Polonius后就能够通过编译了。
我知道这个写法, 主要是对这里的生命周期报错感到困惑
--
👇
苦瓜小仔: ```RUST s.bytes().map(|x| (x - b'a') as usize).for_each(|i| { p = p.nodes[i].get_or_insert_with(|| Default::default()); });