获取字节数组的读取器

10

我正在尝试测试一些需要读取器的代码。我有一个函数:

fn next_byte<R: Read>(reader: &mut R) -> ...

我该如何在一些字节数组上进行测试?文档中表示有一个 impl<'a> Read for &'a [u8],这意味着应该可以这样做:

next_byte(&mut ([0x00u8, 0x00][..]))

但是编译器并不同意:

the trait `std::io::Read` is not implemented for the type `[u8]`

为什么?我明确说了&mut

使用Rust 1.2.0版本。

1个回答

12

您正在尝试调用 next_byte::<[u8]>,但是[u8]没有实现Read[u8]&'a [u8]不是相同的类型![u8]是不定长数组类型,而&'a [u8]是一个slice。

当您在slice上使用Read实现时,它需要改变slice以便下一次读取从上一次读取的结尾继续。因此,您需要传递一个可变借用到一个slice。

这里是一个简单的工作示例:

use std::io::Read;

fn next_byte<R: Read>(reader: &mut R) {
    let mut b = [0];
    reader.read(&mut b);
    println!("{} ", b[0]);
}

fn main() {
    let mut v = &[1u8, 2, 3] as &[u8];
    next_byte(&mut v);
    next_byte(&mut v);
    next_byte(&mut v);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接