Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Rust中,如何将具有生命周期的对象推入向量?_Rust_Lifetime_Borrow Checker_Lifetime Scoping - Fatal编程技术网

在Rust中,如何将具有生命周期的对象推入向量?

在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

我有一些类似下面的代码,它尝试从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
                }
            }
        }
    }
}
使用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)?