借用时暂时价值下降

Lau*_*ent 0 rust

我遇到这个问题,因为我正在解构的变量是借用的(?)并且不能在其他方法中使用。这听起来像是一个非常典型的用例,但我不确定如何解决它。

\n
`\xe2\x9e\x9c  hello_cargo git:(master) \xe2\x9c\x97 cargo build\n   Compiling hello_cargo v0.1.0 (/Users/johnny/Projects/hello_cargo)\nerror[E0716]: temporary value dropped while borrowed\n  --> src/main.rs:24:39\n   |\n24 |         let DBAndCFs { db: _, cfs } = self.db.lock().as_ref().unwrap();\n   |                                       ^^^^^^^^^^^^^^                  - temporary value is freed at the end of this statement\n   |                                       |\n   |                                       creates a temporary which is freed while still in use\n25 |         cfs.len()\n   |         --------- borrow later used here\n   |\n   = note: consider using a `let` binding to create a longer lived value\n`\n
Run Code Online (Sandbox Code Playgroud)\n

这是生成此问题的代码:

\n
    use parking_lot::Mutex;\n    \n    struct CF {\n        inner: *mut i32,\n    }\n    \n    struct DBAndCFs {\n        db: i32,\n        cfs: Vec<CF>,\n    }\n    \n    struct DB {\n        db: Mutex<Option<DBAndCFs>>,\n    }\n    \n    impl DB {\n    \n        pub fn open() -> DB {\n            DB {\n                db: Mutex::new(Some(DBAndCFs{ db: 0, cfs: Vec::new() } )),\n            }\n        }\n        pub fn get(&self) -> usize {\n            let DBAndCFs { db: _, cfs } = self.db.lock().as_ref().unwrap();\n            cfs.len()\n        }\n    }\n    fn main() {\n        let db = DB::open();\n        print!("{}", db.get());\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

Cae*_*sar 5

temporary value is freed at the end of this statement
consider using a let binding to create a longer lived value

因此,编译器告诉您这self.db.lock()是一个过早删除的临时文件,您可以通过let绑定来延长其生命周期。该建议非常精确,您甚至可以在不知道发生了什么情况的情况下遵循它:

let db = self.db.lock();
let DBAndCFs { db: _, cfs } = db.as_ref().unwrap();
cfs.len()
Run Code Online (Sandbox Code Playgroud)

这里的原因是self.db.lock()创建一个互斥锁保护,使互斥锁保持锁定直到它被删除。如果你给它一个变量来生存,该变量将存在到作用域的末尾(下一个}),并且防护不会被删除足够长的时间以便你调用cfs.len()。如果您不给它一个变量来生存,它将作为临时变量存在,直到下一个;. 由于您试图保留对cfs除此之外的引用;,因此您将引用受互斥锁保护的内容,而不会锁定互斥锁,这是不允许的。

len在临时锁防护被删除之前执行您想要调用的操作的另一种方法是:

self.db.lock().as_ref().unwrap().cfs.len()
Run Code Online (Sandbox Code Playgroud)