次のようなコードがあります。これは、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 文字列への参照を保持しているため、これを安全に行う方法はありませんか?