如何强制数组在火柴臂内切片?
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
手臂内执行此操作?
"Use two match
arms" 不是这个问题的答案。
你不能;你将需要使用两个火柴臂:
match arr {
EnumArray::One(arr) => use_array_as_slice(&arr),
EnumArray::Two(arr) => use_array_as_slice(&arr),
}
模式匹配是编译时的概念,强制转换是运行时的概念。您不能 "run code" 在一个模式中。
我有一个枚举,其中每个变体都有一个数组,但数组的长度不同。如果我尝试 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
手臂内执行此操作?
"Use two match
arms" 不是这个问题的答案。
你不能;你将需要使用两个火柴臂:
match arr {
EnumArray::One(arr) => use_array_as_slice(&arr),
EnumArray::Two(arr) => use_array_as_slice(&arr),
}
模式匹配是编译时的概念,强制转换是运行时的概念。您不能 "run code" 在一个模式中。