在Rust中,如何将具有生命周期的对象推入向量?
我有一些类似下面的代码,它尝试从websocket读取,将JSON结果解析为一个结构,然后将该结构推送到在Rust中,如何将具有生命周期的对象推入向量?,rust,lifetime,borrow-checker,lifetime-scoping,Rust,Lifetime,Borrow Checker,Lifetime Scoping,我有一些类似下面的代码,它尝试从websocket读取,将JSON结果解析为一个结构,然后将该结构推送到Vec缓冲区。但是,代码无法编译,因为结构有生命周期,借用检查器抱怨JSON字符串的生命周期不够长 use serde::{Deserialize, Serialize}; use tungstenite::client::AutoStream; use tungstenite::protocol::WebSocket; #[derive(Serialize, Deserialize, De
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
}
}
}
}
}
使用serde::{反序列化,序列化};
使用tungstenite::client::AutoStream;
使用tungstenite::protocol::WebSocket;
#[派生(序列化、反序列化、调试、克隆)]
struct MyType,>=serde_json::from_str(&resp_raw);
已解析匹配响应{
Err(Err)=>Some(Err.into()),
正常(resp)=>{
buff.push(resp.clone());
没有一个
}
}
}
}
}
确切的错误是,借用值[&resp_raw]的寿命不够长
我想知道我应该如何重新构造此代码以满足借用检查器的要求;将具有生存期的结构推送到Vec
param上的正确方法是什么
或者是这样的情况,
&'a str
解析成MyType
后,实际上仍然保留对原始JSON字符串的引用,因此无法安全地执行此操作?仔细查看serde_JSON::from_str
:
pub fn from_str<'a, T>(s: &'a str) -> Result<T>
where
T: Deserialize<'a>,
pub fn from_str Result
哪里
T:反序列化为什么要对id
使用&str
?如果它是一个引用,那么ID需要由其他东西拥有,但是您的代码专门从一个strong创建一个struct,然后丢弃该字符串,因此任何东西都不会拥有该ID。ID
可以改为string
吗?您可以粘贴一个工作场所链接(不依赖tungstenite)?