rust 如何在结构体的生命周期内“保管”变量?[已关闭]

1tu0hz3e  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(103)

已关闭。此问题为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()是最终解包函数的正确名称吗?

ajsxfq5m

ajsxfq5m1#

这是Rust中常用的方法,但是你不应该调用drop()方法。Drop::drop()方法有不同的语义。method returning the wrapped value is into_inner()的常用名称。
根据您的用例,您还可以将一个对writer的可变引用传递到 Package 器中。对实现Write的对象的可变引用也实现了Write,因此无需任何进一步的代码即可工作。使用borrow的好处是您不需要做任何事情来取回原始writer。一旦borrow结束,你可以立即再次使用原来的值。缺点是你不能在一个不同于你创建结构体的上下文中打开 Package 的编写器。

相关问题