2015-10-21 122 views
4

我试图测试一些需要读取器的代码。我有一个功能:获取字节数组的读取器

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

回答

5

您正在试图调用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); 
}