无法在u8数组上使用字节顺序板条箱中的方法:在当前作用域中找不到用于类型的方法

时间:2018-06-24 12:53:28

标签: rust

我正在尝试使用字节顺序板条箱提供的特征:

extern crate byteorder;

use byteorder::{LittleEndian, ReadBytesExt};

fn main() {
    let mut myArray = [0u8; 4];
    myArray = [00000000, 01010101, 00100100, 11011011];

    let result = myArray.read_u32::<LittleEndian>();

    println!("{}", result);
}

我遇到错误:

error[E0599]: no method named `read_u32` found for type `[u8; 4]` in the current scope
  --> src/main.rs:10:26
   |
10 |     let result = myArray.read_u32::<LittleEndian>();
   |                          ^^^^^^^^
   |
   = note: the method `read_u32` exists but the following trait bounds were not satisfied:
           `[u8; 4] : byteorder::ReadBytesExt`
           `[u8] : byteorder::ReadBytesExt`

我已经阅读了有关特质的这本书一章,无法理解为什么这里不满足特质约束。

1 个答案:

答案 0 :(得分:1)

[u8][u8; 4]均未实现ReadBytesExt。如图in the documentation所示,您可以使用std::io::Cursor

let my_array = [0b00000000,0b01010101,0b00100100,0b11011011];
let mut cursor = Cursor::new(my_array);

let result = cursor.read_u32::<LittleEndian>();

println!("{:?}", result);

Playground

在这里可以使用实现Read的任何类型,因为ReadBytesExt的实现方式如下(source link):

impl<R: io::Read + ?Sized> ReadBytesExt for R {}

由于&[u8]实现了Read,因此您可以将其简化为

(&my_array[..]).read_u32::<LittleEndian>();

或者甚至直接使用LittleEndian特性:

LittleEndian::read_u32(&my_array);

游乐场:(&my_array)LittleEndian


您的代码中还有其他错误:

  • [00000000,01010101,00100100,11011011]将自动换行。使用binary literal instead[0b0000_0000,0b0101_0101,0b0010_0100,0b1101_1011]
  • 您应该使用_来使长号更易读
  • 变量应位于snake_case中。使用my_array代替myArray
  • 您在代码中进行了不必要的分配。使用let my_array = [0b0000...

另请参阅: