我遇到这个问题,因为我正在解构的变量是借用的(?)并且不能在其他方法中使用。这听起来像是一个非常典型的用例,但我不确定如何解决它。
\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`\nRun 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 }\nRun Code Online (Sandbox Code Playgroud)\n
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)
| 归档时间: |
|
| 查看次数: |
6562 次 |
| 最近记录: |