Rust 为什么BufWriter将内部写入包装在一个选项中?
在标准库中,Rust 为什么BufWriter将内部写入包装在一个选项中?,rust,Rust,在标准库中,BufWriter声明如下: pub struct BufWriter<W: Write> { inner: Option<W>, buf: Vec<u8>, // #30888: If the inner writer panics in a call to write, we don't want to // write the buffered data a second time in BufWriter's
BufWriter
声明如下:
pub struct BufWriter<W: Write> {
inner: Option<W>,
buf: Vec<u8>,
// #30888: If the inner writer panics in a call to write, we don't want to
// write the buffered data a second time in BufWriter's destructor. This
// flag tells the Drop impl if it should skip the flush.
panicked: bool,
}
pub结构BufWriter{
内部:选项,
buf:Vec,
//#30888:如果内心的作者在打电话要求写作时惊慌失措,我们不想这样做
//在BufWriter的析构函数中再次写入缓冲数据
//标志告诉Drop impl是否应跳过刷新。
惊慌失措:布尔,
}
正如文档所告诉我们的,
惊慌失措
作为一种安全措施存在,可以防止在展开时重复写入,我理解其背后的原因。内部写入程序被包装在选项中是否有类似的原因?我在代码中发现,选项
实际上被清除的唯一部分是在中,但我看不出为什么裸值以及按值取的self
也不可能做到这一点。原因很简单:BufWriter
实现Drop
,并且不能从实现Drop
的类型移出字段。就在BufWriter::into_internal
返回之前,调用BufWriter::drop
,因为BufWriter
被移动到函数的self
参数中,然后超出范围–这是标准RAII
如果你能移出一个区域,那么析构函数会发生什么?要么它根本不会被调用,这会令人惊讶,要么它会被一些包含无效值的字段调用,这可能会违反内存安全。我没有想到这一点。那么你能用这个选项来防止恐慌吗?也就是说,暂时把内部的编写器取下来,然后再还给我,而不是self.panicked=true
,但这可能会稍微贵一点,因为它需要制作两份W
(其大小我们不知道)的(浅)副本。另一方面,panicked
字段的长度为一个字节,因此它是一个已知的、较小的固定成本。相关:几天前被关闭为延期
。这也是相关的。