我正在尝试测试一些需要读者的代码。我有一个功能:
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
答案 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);
}