rust - 写!引用时宏不会在单独的方法中编译
问题描述
这是我的代码:
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
.
那么这是如何工作的呢?对sWrite
有一个额外的实现&File
。因此,您可以写入对不可变文件的可变引用。我不是很肯定,但我相信这是作为一种故意的解决方法添加的,以允许File
s 被写入不变。
它在第一种情况下有效,因为&f
创建了一个临时的,可以可变地使用。write!(f, ...
(with f
being &File
) 不起作用的原因是因为f
是一个write_fmt
想要修改的变量,所以它需要是mut
.
fn write_hi(mut f: &File) {
// ^^^
write!(f, "hi").unwrap();
}
也可以看看:
推荐阅读
- node.js - MERN mongoDB 集合未更新且未发送响应
- android - 添加一个新的 CheckBox 和一个 editText 视图,当用户在 android 的键盘上点击 Done 时?
- jquery - 我的 AJAX 调用工作正常,但成功功能不起作用
- django - Django - PUT 端点验证器错误“wrapped_view() 缺少 1 个必需的位置参数:'request'”
- php - 尝试使用 PHP 脚本将值从 HTML 表单发送到电子邮件,使用代码时收到错误 405
- laravel - 如何修改关系?
- java - 使用 Blogger API 添加帖子不起作用
- terraform - Terraform - 向 ignore_changes 添加例外
- java - 为什么下面代码中java中的浮点默认值不是0.0f
- ros - 为 gmapping 包订阅新主题时出错