2个版本
使用旧Rust 2015
0.0.2 | 2015年1月30日 |
---|---|
0.0.1 | 2015年1月10日 |
#22 in #invariants
15KB
221 行
peekable-reader-rs
一个Rust的实用结构体:任何Reader
的包装器,允许执行peek
操作,以及常规的Reader
方法。
用法
目前,PeekableReader
公开了一个额外的单个方法:fn peek_byte(&mut self) -> IoResult<u8>
,这与由Reader
特质公开的read_byte
方法类似,返回下一个read_byte
将返回的结果。这允许客户端检查下一次读取操作的结果,而实际上并不消耗输入中的字节。
错误语义是这样的,即当在执行peek
操作时,底层的包装Reader
抛出的任何错误都会在随后的读取方法调用中返回,这样就可以保持peek_byte
的结果始终与接下来的read_byte
操作的结果相同。
由于PeekableReader
也实现了Reader
特质,因此它可以无缝地插入任何其他Reader
实现可以插入的地方。
// Wrap any `Reader` instance into a PeekableReader.
let mut peekable_reader = PeekableReader::new(MemReader::new(vec![1, 2, 3]));
// Now we can peek at the next byte, without consuming it...
let b = peekable_reader.peek_byte();
// Multiple calls of `peek_byte` before a read always return the same result
assert!(peekable_reader.peek_byte() == b);
// ...the result of the `peek_byte` is always exactly what the next
// `read_byte` call returns.
assert!(peekable_reader.read_byte() == b);
assert!(b.unwrap() == 1);
// A peeked byte is always correctly included in a read, regardless of which
// flavor of read is used from the `Reader` trait.
let _ = peekable_reader.peek_byte();
// (e.g. read into a buffer)
let mut buffer: Vec<u8> = vec![0, 0];
peekable_reader.read(buffer.as_mut_slice());
assert_eq!(vec![2, 3], buffer);
// Peeking at the end returns an EOF
assert!(match peekable_reader.peek_byte() {
Err(IoError { kind: IoErrorKind::EndOfFile, .. }) => true,
_ => false,
});