Можно сгенерировать соответствие между перечислением и содержимым вектора - PullRequest
0 голосов
/ 20 июня 2020

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

#[derive(Debug)]
enum Types {
    Int(i32),
    Float(f64),
    Text(String),
}

fn main() {
    let type = vec![Types::Int(3),Types::Float(3.3),Types::Text("Hi".to_string())];
    println!("{:?}",&type[0]);
    //if let Types::Int(number) = &type[0] {println!("{:?}",number)}

    println!("{:?}",Types::Int(3));
    match &type {
        Types::Int(number) => number,
        Typer::Float(float) => float,
        _=> None,
    }

}

1 Ответ

0 голосов
/ 20 июня 2020

Этот код не может быть скомпилирован.

Помимо того факта, что вы повторно используете ключевое слово type в качестве имени переменной, невозможно вывести тип возвращаемого значения вашего оператора соответствия.

В каждом из руки вашего выражения соответствия, код возвращает разные типы. В первом - i32, во втором - f64, а в третьем - Option вариант. Это станет более очевидным, если вы попытаетесь присвоить результат.

let foo: <????> = match &typ {
    Types::Int(number) => number,
    Types::Float(float) => float,
    _ => None,
};

Какой тип должен быть выведен для foo? Не существует согласованного варианта, поскольку он зависит от значения typ в времени выполнения и поэтому не может использоваться для определения его типа во время компиляции времени.

К счастью, компилятор Rust великолепен, и вы видите именно это в сообщении об ошибке (после исправления других проблем).

error[E0308]: `match` arms have incompatible types
  --> src/main.rs:16:32
   |
14 | /     match typ[0] {
15 | |         Types::Int(number) => number,
   | |                               ------ this is found to be of type `i32`
16 | |         Types::Float(float) => float,
   | |                                ^^^^^ expected `i32`, found `f64`
17 | |         _=> None,
18 | |     }
   | |_____- `match` arms have incompatible types

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