写!引用时宏不会在单独的方法中编译
这是我的代码:
use std::fs::File;
use std::io::Write;
fn main() {
let f = File::create("").unwrap();
// Compiles
write!(&f, "hi").unwrap();
write_hi(&f);
}
fn write_hi(f: &File) {
// Doesn't compile (cannot borrow `f` as mutable, as it is not declared as mutable)
write!(f, "hi").unwrap();
}
当我在没有文件作为参数值的情况下使用这一行时,它会编译:
write!(&f, "hi").unwrap();
但是,当f是参数值时,我收到编译错误。当我在f变量和方法参数的声明中进行一些可变性更改时,它会起作用,但这不是很奇怪吗?
为什么write!宏在用作参数值时不能在非可变引用上工作,就像在同一方法中声明引用变量时编译一样?
回答
的write!宏内部使用write_fmt,这需要&mut self。你write!(&f, ...)实际上是奇怪的,因为被写入的对象应该是可变的,但是你有一个不可变的File.
这是如何工作的呢?Write有一个额外的实现了&File秒。因此,您可以写入对不可变文件的可变引用。我并不乐观,但我相信这是作为一种有意的解决方法添加的,以允许Files 被写入不变。
它在第一种情况下有效,因为&f创建了一个临时的,可以可变地使用。之所以write!(f, ...(带f是&File)不工作,因为f是一个变量write_fmt要修改,所以它需要mut。
fn write_hi(mut f: &File) {
// ^^^
write!(f, "hi").unwrap();
}
也可以看看:
- 为什么可以在对 File 的不可变引用上实现 Read?