为什么在Rust中调用方法时文件必须是mut?

pbpqsu0x  于 2023-06-23  发布在  其他
关注(0)|答案(3)|浏览(154)

有一个生 rust 的方法,像这样:

fn read_username_from_file() -> Result<String, io::Error> {
    let username_file_result = File::open("hello.txt");

    let mut username_file = match username_file_result {
        Ok(file) => file,
        Err(e) => return Err(e),
    };

    let mut username = String::new();

    match username_file.read_to_string(&mut username) {
        Ok(_) => Ok(username),
        Err(e) => Err(e),
    }
}

我的问题是为什么变量username_file必须是mut。后来我没有修改它。

dz6r00yl

dz6r00yl1#

方法std::io::Read::read_to_string使用&mut selfusername_fileFile,它实现了Read,因此您将&mut File作为接收方调用该方法。&mut T的创建要求T类型的绑定(即username_file)要么是临时的,要么标记为mut

yacmzcpb

yacmzcpb2#

因为username_file包含一个指向文件中当前位置的光标。当您从它读取时,您将该光标移动到读取数据的末尾,以便后续读取可以从您停止的位置开始。这被视为修改了username_file变量,并且在语言中表现为Read trait中的所有阅读方法都应用于&mut self而不是&self
特别是,您使用的是read_to_string,它在填充字符串后将文件光标移动到文件的末尾。

s6fujrry

s6fujrry3#

从文档:
https://doc.rust-lang.org/std/fs/struct.File.html
请注意,虽然读写方法需要&mut File,但由于读写接口的关系,&File的保持器仍然可以修改文件,要么通过获取&File的方法,要么通过检索底层OS对象并以这种方式修改文件。此外,许多操作系统允许不同进程并发修改文件。避免假设持有一个文件(&File)意味着文件不会更改。

相关问题