这将编译并通过测试:
use std::io::Write;
/*
* This transforms a writer into a writer where every write is prefixed
* with a timestamp and terminated with a newline.
*/
struct Timestamper<T: Write> {
writer: T,
}
impl<T: Write> Timestamper<T> {
pub fn new(writer: T) -> Timestamper<T> {
Timestamper { writer }
}
pub fn drop(self) -> T {
self.writer
}
}
impl<T: Write> Write for Timestamper<T> {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.writer.write(b"timestamp ")?;
let expected_size = self.writer.write(buf)?;
self.writer.write(b"\n")?;
std::io::Result::Ok(expected_size)
}
fn flush(&mut self) -> std::io::Result<()> {
self.writer.flush()
}
}
#[cfg(test)]
mod tests {
use std::io::Write;
use super::Timestamper;
#[test]
fn test_timestamper() {
let buf = Vec::new(); // buffer to write into
let mut timestamper = Timestamper::new(buf);
let hello_len = timestamper.write(b"hello").unwrap();
let world_len = timestamper.write(b"world").unwrap();
assert_eq!(hello_len, 5);
assert_eq!(world_len, 5);
let buf2 = timestamper.drop();
assert_eq!(buf2.as_slice(), b"timestamp hello\ntimestamp world\n");
}
}
正在制作
drop()
方法,该方法返回
writer
对象,在Rust中惯用?
是
下降()
最终展开函数的正确名称?