【发布时间】:2023-01-26 22:18:07
【问题描述】:
这是一些看起来应该有效的简单代码:
use serde_json;
use std::io::Write;
fn test(writer: &mut dyn Write) {
serde_json::to_writer(writer, "test1").unwrap();
serde_json::to_writer(writer, "test2").unwrap();
}
但它会产生以下错误:
error[E0382]: use of moved value: `writer`
--> src/main.rs:35:27
|
33 | fn test(writer: &mut dyn Write) {
| ------ move occurs because `writer` has type `&mut dyn std::io::Write`, which does not implement the `Copy` trait
34 | serde_json::to_writer(writer, "test1").unwrap();
| ------ value moved here
35 | serde_json::to_writer(writer, "test2").unwrap();
| ^^^^^^ value used here after move
为了让它工作,我必须跳过这个圈:
fn test(writer: &mut dyn Write) {
serde_json::to_writer(&mut *writer, "test1").unwrap();
serde_json::to_writer(writer, "test2").unwrap();
}
这里发生了什么?为什么我可以通过取消引用/重新引用来“手动”复制引用,但它没有实现复制?
这与 serde_json::to_writer 的通用类型签名特别有关,因为它也适用于不同的功能:
fn test(x: &mut dyn Write) {
x.write_all(b"test1").unwrap();
x.write_all(b"test2").unwrap();
}
【问题讨论】:
-
TL/DR 重复项:当编译器期望显式
&mut引用(如第二个示例)时,Rust 隐式重新借用,但serde_json::to_writer采用泛型。
标签: rust serde-json