如何在结构的生命周期内"take custody"变量?



编译并通过测试:

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 hellontimestamp worldn");
}
}

创建一个返回writer对象的drop()方法在Rust中是习惯用法吗?

drop()是最终解包裹函数的正确名称吗?

这是Rust中常见的方法,但是您不应该调用drop()方法。Drop::drop()方法具有不同的语义。返回包装值的方法的通用名称是into_inner()

根据您的用例,您还可以将对写入器的可变引用传递到包装器中。对实现Write的对象的可变引用也实现了Write,因此不需要任何进一步的代码就可以工作。使用借用的好处是,你不需要做任何事情来让原作者回来。一旦借阅结束,您可以立即再次使用原始值。缺点是不能在与创建结构体不同的上下文中展开已包装的写入器。

最新更新