< 返回版块

xBINj 发表于 2023-08-30 11:46

有以下2段代码:

代码片段1,这段代码编译运行无问题。

#[derive(Debug)] 
struct MyType; 

let mut x0 = MyType; 
{
    let xx = &mut x0;
    let x5: &MyType = (xx).borrow();
    print!("x5:{:p}, ", x5);
}

代码片段2,这段代码编译不通过,提示信息如下:

#[derive(Debug)]
struct MyType;

let mut x0 = MyType;
{
    let x5: &MyType = (&mut x0).borrow();//这一行编译出错
    print!("x5:{:p}, ", x5);
}

提示错误信息,意思是这行代码结束,生命周期就结束了。提示信息如下:

temporary value dropped while borrowed
consider using a `let` binding to create a longer lived valuerustcClick for full compiler diagnostic
main.rs(187, 45): temporary value is freed at the end of this statement
main.rs(188, 29): borrow later used here

我有点看不太懂,为啥直接(&mut x0)就生命周期结束了。 大佬们帮忙指点一二。

评论区

写评论
night-cruise 2023-08-31 09:50

这就是 Rust 的规则呀,临时产生的值在语句结束后就被丢弃了。

LongRiver 2023-08-30 14:40

你的第二段代码等价于:

{
    let x5: &MyType = {
        let tmp = &mut x0;
        tmp.borrow()
    };  // <---x5引用了这个tmp,而这个tmp在这里就结束了
    print!("x5:{:p}, ", x5);
}
bestgopher 2023-08-30 14:37

不知道怎么解释,不过第二种在调用完生命周期就结束了 https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e27ebf2a55e6bb68153bbb4456045da9

1 共 3 条评论, 1 页