Соответствие строки с опцией в Rust - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь сопоставить входные данные с возможными типами, которые затем преобразуют это строковое значение в число. У меня есть что-то вроде этого:

fn letter_to_num(nameNum: &str) -> Option<f32> {
match nameNum {
    Some(num) => {
        "One" => 1.0,
        "Two" => 2.0,
        "Three" => 3.0
    },
    None => println!("Invalid Number"),
}
}

Если он не может соответствовать вводу, он вернет ошибку. В противном случае он будет совпадать с одним из элементов и вернет Some (num) в случае успеха. Я не совсем уверен, куда помещать операторы option, и разные комбинации, похоже, тоже не хотят компилироваться. Основная ошибка, которую я получаю, это сказать

Ожидается один из '.', ',', ';' Или найден оператор '=>'

Ответы [ 2 ]

3 голосов
/ 03 апреля 2020

Во-первых, вы выполняете сопоставление с & str, а не с Option, поэтому ваш код должен выглядеть примерно так.

fn letter_to_num(nameNum: &str) -> Option<f32> {
    match nameNum {
        "One" => Some(1.0),
        "Two" => Some(2.0),
        "Three" => Some(3.0),
        _ => None // or panic!("message")
    }
}

Ключевые моменты здесь:

  • Вам нужно чтобы соответствовать значениям & str и вернуть Option, не совпадать с Option

  • Вам необходимо либо вернуть правильное значение из функции (Some или None), либо pani c. Println! не паникует и не возвращает правильное значение типа. Так как паника из любопытства, технически говоря, никогда не возвращается к вызывающей стороне, таким образом, разрешается, они нарушают выполнение программы.

  • Когда вы подходите, чтобы указать исчерпывающий набор совпадений, подойдет подстановочный знак, такой как _. Это в основном говорит - соответствуйте всему здесь. Таким образом, вы поставили это в последнюю очередь. Вы можете использовать переменную, например, a, например, вот так a => panic!("Invalid value {}", a)

Просто некоторые общие замечания:

  • При сравнении входных данных учитывайте верхний и нижний регистр В этом случае вы можете добиться этого, например, преобразовав ввод в нижний регистр и затем сопоставив, если, конечно, вы не рассматриваете только заглавные слова как правильные.
2 голосов
/ 03 апреля 2020

Вводом является &str, а не Option<&str>, поэтому Some(num) не будет соответствовать шаблону nameNum. Он также должен быть переименован в name_num, в противном случае вы получите предупреждение об этом. Так как вы хотите вернуть сообщение об ошибке для строк, которые не совпадают, вы можете использовать Result.

fn letter_to_num(name_num: &str) -> Result<f32, &str> {
    match name_num {
        "One" => Ok(1.0),
        "Two" => Ok(2.0),
        "Three" => Ok(3.0),
        _ => Err("Invalid Number"),
    }
}

. Протестировать приведенный выше код на площадка .

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