Этот код не может быть скомпилирован.
Помимо того факта, что вы повторно используете ключевое слово 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