类型不匹配的错误:Option<&[u8]> 和 Option<&[u8;32]>

Ziv*_*iva 2 rust

我在玩 Rust 代码,但我遇到了转换Option<&[u8; 32]>Option<&[u8]>.

一个(非常)简化的例子:

pub type Foo = [u8; 32];

fn fun_one(inp: Option<&[u8]>) {
    println!("{:?}", inp);
}

fn fun_two(x: Option<&Foo>) {
    fun_one(x)
}

fn main() {
    let x = [11u8; 32];
    fun_two(Some(&x));
}
Run Code Online (Sandbox Code Playgroud)

链接:Rust Playground

error[E0308]: mismatched types
 --> src/main.rs:8:13
  |
8 |     fun_one(x)
  |             ^ expected slice `[u8]`, found array `[u8; 32]`
  |
  = note: expected enum `Option<&[u8]>`
             found enum `Option<&[u8; 32]>`
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 5

切片不仅仅是数组上的指针。它既是指向数据的指针,又是一个长度(参见数组和切片),因为它仅指数组的一部分。这就是类型不兼容的原因。

您在这里想要的是整个数组的切片,您可以使用.. 全范围表达式: slice = &array[..]

有一个选项,您可以使用map有条件地应用此转换。

结合所有这些:

fn fun_two(x: Option<&Foo>) {
    fun_one(x.map(|a| &a[..]))
}
Run Code Online (Sandbox Code Playgroud)