gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:26:07 27 4
gpt4 key购买 nike

这是我的代码:

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有一个额外的 implementation&File s。因此,您可以写入对不可变文件的可变引用。我并不乐观,但我相信这是作为一种有意的解决方法添加的,以允许 File s 被写入不变。
它适用于第一种情况,因为 &f创建一个临时的,可以可变地使用。原因write!(f, ... (与 f&File )不起作用是因为 f是一个变量 write_fmt要修改,所以需要是mut .

fn write_hi(mut f: &File) {
// ^^^
write!(f, "hi").unwrap();
}
也可以看看:
  • Why is it possible to implement Read on an immutable reference to File?
  • 关于rust - 写!引用时宏不会在单独的方法中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65135562/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com