【发布时间】:2020-03-25 17:38:35
【问题描述】:
我的代码有点类似于以下内容,它尝试从 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字符串的引用,所以没有办法安全地这样做?
【问题讨论】:
-
您为什么使用
&str代替id?如果它是一个引用,那么 ID 需要由其他东西拥有,但是您的代码专门从一个 strong 创建一个结构,然后丢弃该字符串,因此没有任何东西会拥有该 ID。id可以改为String吗? -
您能粘贴一个有效的操场链接(不依赖于 tungstenite)吗?
标签: rust lifetime borrow-checker lifetime-scoping