在 rust 程序中借用时临时价值下降

  • 本文关键字:rust 程序 rust
  • 更新时间 :
  • 英文 :


在模块 db.rs 中,从数据库读取值时,我在借用时删除了错误临时值 考虑使用let绑定来创建生存期更长的值

use bytes::Bytes;
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
#[derive(Clone, Debug)]
pub struct Db {
// pub entries: Arc<bool>,
pub entries: Arc<Mutex<HashMap<String, Bytes>>>,
}
impl Db {
pub fn new() -> Db {
Db {
entries: Arc::new(Mutex::new(HashMap::new())),
}
}
/// Reads data from the database
pub fn read(&mut self, arr: &[String]) -> Result<Bytes, &'static str> {
let key = &arr[1];
let query_result = self.entries.lock().unwrap().get(key);// Error in this Line.
if let Some(value) = query_result {
return Ok(Bytes::from("hello"));
} else {
return Err("no such key found");
}
}
}

但是当我修改代码并尝试获取下一行中的值时,它没有给出任何错误。

let query_result = self.entries.lock().unwrap();
let result =  query_result.get(key);

谁能帮我了解引擎盖下发生了什么?

我们可以通过检查 Rust 的工作原理来了解为什么 Rust 认为这是一个错误Mutex::lock。如果成功,它不会直接返回引用,而是返回一个MutexGuard结构,该结构可以取消引用到它包装的类型中,在您的情况下是HashMap

Deref::deref<Target = T>的签名是(添加省略的生存期):

fn deref<'a>(&'a self) -> &'a T

这意味着MutexGuard只能为我们提供内部HashMap的参考,只要它本身还活着(生命周期'a)。但是因为你从不把它存储在任何地方,而是直接取消引用它,Rust 认为它在调用get后立即被删除。但是你保留了get的结果,它只能存在,只要对HashMap的引用传递到它,而又只能与立即掉落的MutexGuard一样长。

另一方面,如果您存储MutexGuard,例如

let guard = self.entries.lock().unwrap();
let query_result = guard.get(key);

它只会在作用域的末尾被删除,因此它给出的任何引用在作用域结束时也有效。

最新更新