Как я могу привести массивы к слайсам внутри спичечной руки? - PullRequest
0 голосов
/ 23 марта 2020

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

enum EnumArray {
    One([i32; 1]),
    Two([i32; 2]),
}

fn main() {
    let arr = EnumArray::One([1]);
    match arr {
        EnumArray::One(arr) | EnumArray::Two(arr) => use_array_as_slice(&arr),
    }
}

fn use_array_as_slice(arr: &[i32]) {}

, я получаю сообщение об ошибке:

error[E0308]: mismatched types
 --> src/main.rs:9:46
  |
8 |     match arr {
  |           --- this expression has type `EnumArray`
9 |         EnumArray::One(arr) | EnumArray::Two(arr) => use_array_as_slice(&arr),
  |                                              ^^^ expected an array with a fixed size of 1 element, found one with 2 elements
  |
  = note: expected type `[i32; 1]`
             found type `[i32; 2]`

Как я понимаю, мне нужно привести типы [i32; 1] и [i32; 2] &[i32] чтобы исправить эту ошибку. Как я могу сделать это внутри match руки?

детская площадка

«Использовать две руки match» не является ответом на этот вопрос.

1 Ответ

2 голосов
/ 23 марта 2020

Вы не можете; вам нужно будет использовать два ответвления:

match arr {
    EnumArray::One(arr) => use_array_as_slice(&arr),
    EnumArray::Two(arr) => use_array_as_slice(&arr),
}

Сопоставление с образцом - это концепция времени компиляции, а приведение - концепция времени выполнения. Вы не можете "запустить код" в шаблоне.

...