Новое для ржавчины. Для приведенного ниже кода проблема заключается в get_value. Я хочу вернуть ссылку на существующее значение в хэш-карте, но если значение не существует, мне нужно вернуть ссылку на BulkString(None)
, которая представляет собой своего рода нулевое значение для RespType
. Компилятор возвращает проблему со временем жизни, говоря, что v
является временным, хотя он разделяет время жизни 'a
с self
. Это основная проблема, и я не уверен, почему это происходит.
use std::collections::HashMap;
use std::sync::RwLock;
#[derive(Debug, PartialEq, Eq)]
pub enum RespType<'a> {
SimpleString(&'a str),
RespError((&'a str, &'a str)),
Integer(i32),
BulkString(Option<&'a str>),
Array(Vec<RespType<'a>>),
}
type Db<'a> = RwLock<HashMap<&'a str, RespType<'a>>>;
pub trait KeyValueStore<'a> {
fn get_value(&'a self, key: &'a str) -> &'a RespType<'a>;
fn set_value(&'a mut self, key: &'a str, value: RespType<'a>) -> &'a RespType<'a>;
}
impl<'a> KeyValueStore<'a> for Db<'a> {
fn get_value(&'a self, key: &'a str) -> &'a RespType<'a> {
static null_bulk_string:RespType = RespType::BulkString(None);
match self.read().unwrap().get(key) {
Some(v) => v,
None => {
&null_bulk_string
}
}
}
fn set_value(&'a mut self, key: &'a str, value: RespType<'a>) -> &'static RespType<'static> {
static ok: RespType = RespType::SimpleString("OK");
(*self.get_mut().unwrap()).insert(key, value).unwrap();
&ok
}
}
fn main(){
}
Выдает следующую ошибку:
error[E0515]: cannot return value referencing temporary value
--> src/main.rs:23:24
|
22 | match self.read().unwrap().get(key) {
| -------------------- temporary value created here
23 | Some(v) => v,
| ^ returns a value referencing data owned by the current function
For more information about this error, try `rustc --explain E0515`.
Мне также интересно, правильно ли это сделать, чтобы статическое значение типа помещалось за ссылку, если фактическое значение не существует.
Похоже, причина в том, что v был получен, когда была получена блокировка чтения. Он выйдет из области действия, когда будет снята блокировка чтения.
Предположим, что rust позволяет вам вернуть v, это будет проблемой с памятью, если кто-то другой удалит v с карты позже.
Я не уверен, почему за вас проголосовали. Этот анализ правильный. Время жизни
v
не может пережить временного охранника, возвращенного изself.read()
.