8

我正在尝试测试一些需要读者的代码。我有一个功能:

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

使用生锈 1.2.0

4

1 回答 1

9

您正在尝试调用next_byte::<[u8]>,但[u8]没有实现Read[u8]&'a [u8]不一样的类型![u8]是一个无大小的数组类型并且&'a [u8]是一个切片。

当您在切片上使用Read实现时,它需要对切片进行变异,以便下一次读取从上一次读取的末尾恢复。因此,您需要将可变借用传递给切片。

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

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);
}
于 2015-10-21T02:57:12.207 回答