写!引用时宏不会在单独的方法中编译

这是我的代码:

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?

以上是写!引用时宏不会在单独的方法中编译的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>