Как сериализовать структуры в io :: Записать в цикл - PullRequest
1 голос
/ 07 февраля 2020

Мне нужно сделать простое чтение / обработку / запись в 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 у всех oop? Также, как правильно сделать это с помощью * serde's to_writer?

См. plaground .

1 Ответ

4 голосов
/ 07 февраля 2020

Если 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...