Json 如何将结构序列化到io::在循环中写入

Json 如何将结构序列化到io::在循环中写入,json,rust,stream,streaming,serde,Json,Rust,Stream,Streaming,Serde,我需要像这样做一个简单的读/处理/写操作: [deriveserde::反序列化] 结构传入{ 第一:字符串, 最后:弦,, } [deriveserde::序列化] 结构传出{ 名称:String, } //尽可能保持读/写特性的通用性 fn stream_Things阅读器:R,写入器:W{ 让传入:Vec=serde_json::from_readerreader.unwrap; 对于传入的{ 设b=外向型{ 名称:format!{}{},a.first,a.last, }; serde_

我需要像这样做一个简单的读/处理/写操作:

[deriveserde::反序列化] 结构传入{ 第一:字符串, 最后:弦,, } [deriveserde::序列化] 结构传出{ 名称:String, } //尽可能保持读/写特性的通用性 fn stream_Things阅读器:R,写入器:W{ 让传入:Vec=serde_json::from_readerreader.unwrap; 对于传入的{ 设b=外向型{ 名称:format!{}{},a.first,a.last, }; serde_json::to_writerwriter,&b.unwrap; } } fn干线{ 流内容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,然后也是io::Write:

impl给定W是io::Write,那么也是io::Write:


当你意识到self可以是一个参考时,你开始理解rust。当你意识到self可以是一个参考时,你开始理解rust。你介意我问一下你是如何从错误消息中找到&mut的吗?我永远不会想到。@DmytriiNagirniak真的没有什么特别的。单独使用值将消耗它,而通过其引用或可变引用则不会。阅读任何Rust API签名,这是一件决定如何使用它的事情。您介意我问一下您是如何从错误消息中访问&mut的吗?我永远不会想到。@DmytriiNagirniak真的没有什么特别的。单独使用值将消耗它,而通过其引用或可变引用则不会。阅读任何Rust API签名,这是一件决定如何使用它的事情。
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();
    }
}