如何强制数组在火柴臂内切片?

How can I coerce arrays to slices inside a match arm?

我有一个枚举,其中每个变体都有一个数组,但数组的长度不同。如果我尝试 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 手臂内执行此操作?

playground

"Use two match arms" 不是这个问题的答案。

你不能;你将需要使用两个火柴臂:

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

模式匹配是编译时的概念,强制转换是运行时的概念。您不能 "run code" 在一个模式中。