Получить или создать необязательное поле Вариант <T> - PullRequest
1 голос
/ 30 мая 2020

Существует способ получить или создать подобное upsert в словарях базы данных без обязательного поля.

В следующем коде игровая площадка сбой, потому что self.option заимствован.

#[derive(Debug)]
struct A {
    option: Option<i32>,
}

impl A {
    fn new() -> Self {
        Self { option: None }
    }

    fn option_or_new(&mut self) -> &i32 {
        if let Some(i) = &self.option { // `self.option` is borrowed here
            &i
        } else {
            let i = 0;
            self.option = Some(i); // cannot assign to `self.option` because it is borrowed
            self.option.as_ref().unwrap()
        }
    }
}

fn main() {
    let mut a = A::new();
    let i = a.option_or_new();
    println!("{}",i);
}

Я должен использовать небезопасный код для решения этой проблемы, или существует идиоматический c способ для этого?

1 Ответ

4 голосов
/ 30 мая 2020

Вы можете использовать get_or_insert или get_or_insert_with:

impl A {
    fn option_or_new(&mut self) -> &i32 {
        self.option.get_or_insert(0)
    }
}

Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...