有一个生 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。后来我没有修改它。
3条答案
按热度按时间dz6r00yl1#
方法
std::io::Read::read_to_string
使用&mut self
。username_file
是File
,它实现了Read
,因此您将&mut File
作为接收方调用该方法。&mut T
的创建要求T
类型的绑定(即username_file
)要么是临时的,要么标记为mut
。yacmzcpb2#
因为
username_file
包含一个指向文件中当前位置的光标。当您从它读取时,您将该光标移动到读取数据的末尾,以便后续读取可以从您停止的位置开始。这被视为修改了username_file
变量,并且在语言中表现为Read
trait中的所有阅读方法都应用于&mut self
而不是&self
。特别是,您使用的是
read_to_string
,它在填充字符串后将文件光标移动到文件的末尾。s6fujrry3#
从文档:
https://doc.rust-lang.org/std/fs/struct.File.html
请注意,虽然读写方法需要&mut File,但由于读写接口的关系,&File的保持器仍然可以修改文件,要么通过获取&File的方法,要么通过检索底层OS对象并以这种方式修改文件。此外,许多操作系统允许不同进程并发修改文件。避免假设持有一个文件(&File)意味着文件不会更改。