Ergonomi c Обработка опций внутри Ref :: map - PullRequest
2 голосов
/ 17 июня 2020

У меня есть функция, которая пытается вернуть Ref из Refcell. Ссылка находится за Option, и я хотел бы иметь возможность вернуть ссылку или ошибку, если Option равно None.

В настоящее время я заранее проверяю, есть ли это нет и возвращает ошибку, если это так. После этого я вызываю unwrap() в Option внутри Ref::map, чтобы вернуть объект.

Есть ли более эргономичный c способ сделать это? Это кажется очень раздражающим (множественные заимствования (), et c.) Option имеет метод ok_or, который превращает его в тип результата. Есть ли способ использовать это здесь?

Вот Rust Детская площадка для воспроизведения минимального примера:

    pub fn get_thing_convenience(&self) -> Result<Ref<f32>, Box<dyn Error>> {
        if self.thing.borrow().is_none() {
            return Err(Box::new(MyError("blah".into())))
        }
        let thing = Ref::map(self.thing.borrow(), |t| t.unwrap());

        Ok(thing)
    }

1 Ответ

2 голосов
/ 19 июня 2020

Раньше был метод filter_map, но он был удален, потому что функциональность может (обычно?) Быть реализована безопасно с затратами на производительность, и было неясно, был ли filter_map лучший способ go (это будет частным случаем Option, усложняет ситуацию с недавними изменениями / дебатами по Try, и может иметь больше смысла в существовании способа преобразовать Ref<Option<T>> в Option<Ref<T>>). Тем не менее, пока существует ящик ref_filter_map, который делает именно это и считается «безопасным».

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

use ref_filter_map::ref_filter_map;

pub fn get_thing_convenience(&self) -> Result<Ref<f32>, Box<dyn Error>> {
    ref_filter_map(self.thing.borrow(), |t| t)
        .ok_or_else(|| Box::new(MyError("blah".into())))
}

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

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