在旋转变量时,"无法移出变量,因为它是借用的"

Ten*_*den 6 rust borrow-checker

我正在编写一个程序,该程序写入文件并随时旋转它正在写入的文件.当我检查旋转文件时,我似乎无法更改文件,因为它是由我的struct借用的.即使我drop是结构的实例,我似乎无法重新获得文件的所有权来重命名它.这是我的例子:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过将文件创建移动到new函数调用FileStruct而不是有一个中间变量file来实现这一点,但我想知道为什么这个方法我强行删除所有变量引用的所有变量应返回不起作用.

Mal*_*olm 7

由于std::mem::drop文件说,

虽然这确实调用了参数的实现Drop,但它不会释放任何借用,因为借用是基于词法范围.

所以,即使你打电话drop,file仍将继续借用.