已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。
2天前关闭。
截至2天前,社区正在审查是否重新讨论此问题。
Improve this question
这将编译并通过测试:
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中是惯用的吗?drop()
是最终解包函数的正确名称吗?
1条答案
按热度按时间ajsxfq5m1#
这是Rust中常用的方法,但是你不应该调用
drop()
方法。Drop::drop()
方法有不同的语义。method returning the wrapped value isinto_inner()
的常用名称。根据您的用例,您还可以将一个对writer的可变引用传递到 Package 器中。对实现
Write
的对象的可变引用也实现了Write
,因此无需任何进一步的代码即可工作。使用borrow的好处是您不需要做任何事情来取回原始writer。一旦borrow结束,你可以立即再次使用原来的值。缺点是你不能在一个不同于你创建结构体的上下文中打开 Package 的编写器。