0

次のようなコードがあります。これは、websocket から読み取り、JSON の結果を構造体に解析し、その構造体をVecバッファーにプッシュしようとします。ただし、構造体には有効期間があり、借用チェッカーは JSON 文字列の有効期間が不十分であると不平を言うため、コードはコンパイルに失敗します。

use serde::{Deserialize, Serialize};
use tungstenite::client::AutoStream;
use tungstenite::protocol::WebSocket;

#[derive(Serialize, Deserialize, Debug, Clone)]
struct MyType<'a> {
    id: &'a str,
    count: i64,
}

fn example<'a>(
    conn: &mut WebSocket<AutoStream>,
    buff: &'a mut Vec<MyType<'a>>,
) -> Option<Box<dyn std::error::Error>> {
    match conn.read_message() {
        Err(err) => Some(err.into()),
        Ok(msg) => {
            let resp_raw = msg.to_string();
            let resp_parsed: Result<MyType<'a>, _> = serde_json::from_str(&resp_raw);
            match resp_parsed {
                Err(err) => Some(err.into()),
                Ok(resp) => {
                    buff.push(resp.clone());
                    None
                }
            }
        }
    }
}

正確なエラーは、borrowed value [&resp_raw] does not live long enough.

借用チェッカーを満たすために、このコードをどのように再構成する必要があるのか​​ 疑問に思っています。ライフタイムを持つ構造体をパラメーターにプッシュする正しい方法は何Vecですか?

それとも、&'a str解析されたMyTypeものが実際にはまだ元の JSON 文字列への参照を保持しているため、これを安全に行う方法はありませんか?

4

1 に答える 1