< 返回版块

gwy15 发表于 2020-05-08 12:42

use std::cell::RefCell;
pub fn max_level_sum(num: RefCell<Option<i32>>) {
    let num = num;
    if let None = *num.borrow() {
        println!("none");
    }
}

上面的代码加上第 3 行之后,num 和 第 4 行的临时变量会同时在结束的地方析构,从而报生命周期错误——borrowed value does not live long enough

解决方法包括注释掉第 3 行、在第 5 行后添加分号手动使临时变量提前析构等方法。

我刚学 rust 不久,想请问各位,这是 NLL 实现的生命周期检查的 bug 还是设定?谢谢各位

评论区

写评论
cutepig123 2020-05-08 20:14

是有一点奇怪 最后的大括号前面加一个分号的确可以解决问题

huangjj27 2020-05-08 20:10

我试着把第三行的 shadowing 删除了,就可以通过编译了。 原因: RefCell::<T>::borrow(&self) -> Ref<T>, 实际上 Ref<T> 的定义是 Ref<'b, T>,这里推导出为 传入的 num: RefCell<T>的生命周期,然后 shadowing 导致num 提前被drop,因此报错。

Mike Tang 2020-05-08 15:40

手动测了一下,确实有你说的问题。

1 共 4 条评论, 1 页