首页 > 解决方案 > 写!引用时宏不会在单独的方法中编译

问题描述

这是我的代码:

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!宏在用作参数值时不能对非可变引用起作用,就像在同一方法中声明引用变量时那样编译?

标签: rustrust-macros

解决方案


write!宏内部使用它write_fmt需要一个&mut self. 你write!(&f, ...)实际上是一个奇怪的对象,因为被写入的对象应该是可变的,但是你有一个不可变的File.

那么这是如何工作的呢?对sWrite有一个额外的实现&File。因此,您可以写入对不可变文件的可变引用。我不是很肯定,但我相信这是作为一种故意的解决方法添加的,以允许Files 被写入不变。

它在第一种情况下有效,因为&f创建了一个临时的,可以可变地使用。write!(f, ...(with fbeing &File) 不起作用的原因是因为f是一个write_fmt想要修改的变量,所以它需要是mut.

fn write_hi(mut f: &File) {
         // ^^^
    write!(f, "hi").unwrap();
}

也可以看看:


推荐阅读