我需要像这样在Rust中进行简单的读取/处理/写入:
#[derive(serde::Deserialize)]
struct Incoming {
first: String,
last: String,
}
#[derive(serde::Serialize)]
struct Outgoing {
name: String,
}
// Keep the read/write traits as generic as possible
fn stream_things<R: std::io::Read, W: std::io::Write>(reader: R, writer: W) {
let incoming: Vec<Incoming> = serde_json::from_reader(reader).unwrap();
for a in incoming {
let b = Outgoing {
name: format!("{} {}", a.first, a.last),
};
serde_json::to_writer(writer, &b).unwrap();
}
}
fn main() {
stream_things(std::io::stdin(), std::io::stdout());
}
这不能编译,因为:
error[E0382]: use of moved value: `writer`
--> src/main.rs:20:31
|
13 | fn stream_things<R: std::io::Read, W: std::io::Write>(reader: R, writer: W) {
| -- ------ move occurs because `writer` has type `W`, which does not implement the `Copy` trait
| |
| help: consider further restricting this bound: `W: Copy +`
...
20 | serde_json::to_writer(writer, &b).unwrap();
| ^^^^^^ value moved here, in previous iteration of loop
std::io::Write
循环写入的正确方法是什么?还有如何用serde正确地做到这一点to_writer
?
看到的地方。
给定W
为io::Write
,则&mut W
还为io::Write
:
impl<'_, W: Write + ?Sized> Write for &'_ mut W
因此以下编译:
fn stream_things<R: std::io::Read, W: std::io::Write>(reader: R, mut writer: W) {
let incoming: Vec<Incoming> = serde_json::from_reader(reader).unwrap();
for a in incoming {
let b = Outgoing {
name: format!("{} {}", a.first, a.last),
};
serde_json::to_writer(&mut writer, &b).unwrap();
}
}
您介意我问您如何
&mut
从该错误消息中获取信息吗?我永远不会发生。@DmytriiNagirniak真的没什么特别的。单独使用值将消耗它,而通过引用或可变引用则不会。读取任何Rust API签名,这是一件事,表明了打算如何使用它。