Почему этот метод ржавчины считает, что время жизни значения является временным?

Новое для ржавчины. Для приведенного ниже кода проблема заключается в 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`.

Мне также интересно, правильно ли это сделать, чтобы статическое значение типа помещалось за ссылку, если фактическое значение не существует.

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, причина в том, что v был получен, когда была получена блокировка чтения. Он выйдет из области действия, когда будет снята блокировка чтения.

Предположим, что rust позволяет вам вернуть v, это будет проблемой с памятью, если кто-то другой удалит v с карты позже.

Я не уверен, почему за вас проголосовали. Этот анализ правильный. Время жизни v не может пережить временного охранника, возвращенного из self.read().

cdhowie 21.02.2023 08:19

Другие вопросы по теме