Как определить функцию, которая принимает любой аргумент, который реализует черту по умолчанию - PullRequest
0 голосов
/ 13 октября 2019

Моя цель состоит в том, чтобы создать пользовательскую функцию опции развертки, которая работает с любым типом, который реализует черту по умолчанию, и в случае, если у типа нет данных (нет), он возвращает значение по умолчанию для этого типа. Вот моя попытка:

fn unwrap_option(data: Option<T>) -> T 

    where T: Default
{

    if(data.is_none()){
        return T::default();
    }
    else{
        return string.unwrap();
    }

}

Но это не работает.

1 Ответ

1 голос
/ 13 октября 2019

Вы почти у цели!

/// Notice you were missing a generic parameter
fn unwrap_option /*->*/ <T> /*<-*/ (data: Option<T>) -> T 

    where T: Default
{

    if let Some(data) = data {
        data
    } else {
        T::default()
    }
}

Эта попытка получить значение с помощью оператора if let, а затем возвращает значение по умолчанию, если оно равно None. Другой способ написать это так:

fn unwrap_option<T: Default>(x: Option<T>) -> T {
    match x {                   // Have we got data?
        Some(x) => x,           // We do? Return it then
        None    => T::default(),// We don't? Get default then
    }
}

Но, как уже упоминалось в комментариях, использование Option::unwrap_or_default, вероятно, является лучшей идеей.

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