我正在编写一个程序写入文件并旋转文件它似乎改变了文件,因为它是由我的struct借用的 . 即使我 drop
结构的实例,我似乎无法重新获得文件的所有权来重命名它 . 这是我的example:
use std::fs::File;
use std::io::{Write};
use std::mem::{drop};
pub struct FileStruct<W: Write> {
pub writer: Option<W>,
}
impl <W: Write> FileStruct<W> {
pub fn new(writer: W) -> FileStruct<W> {
FileStruct {
writer: Some(writer),
}
}
}
fn main() {
let mut file = File::create("tmp.txt").unwrap();
let mut tmp = FileStruct::new(&mut file);
loop {
if true { //will be time based if check
drop(tmp);
drop(file);
file = File::create("tmp2.txt").unwrap();
tmp = FileStruct::new(&mut file);
}
// write to file
}
}
我知道我可以通过将文件创建移动到 FileStruct
的 new
函数调用而不是具有中间变量 file
来实现此工作,但我想知道为什么这个方法我强行删除所有变量引用的所有变量应该退回不起作用 .
2 回答
正如the std::mem::drop documentation所说,
所以即使你打电话
drop
,仍然会借用file
.删除
tmp
不"release the borrow"file
因为借用是词法范围的 . 只要程序执行在包含tmp
的词法范围内,即使你删除它,它也是"active" . 如果/一旦支持"non-lexical scopes",您将来可能会做什么 . 在此之前,您可以使用RefCell
:这里的诀窍是,给定对
RefCell<T>
的共享引用,你可以(最终)通过borrow_mut()
获得&mut T
. 编译时借用检查器很高兴,因为我们只在表面上使用共享引用,并且可以像这样共享file
. 通过在运行时检查内部T
是否已被可变地借用来避免可变别名 .