我正在重构一些 Rust 代码(见下文)以使用serde
crate 解析各种配置文件(在 JSON 中)。
因此我有 2 个结构:CfgFileWebServer
&CfgFileFtpServer
实现Serialize
&Deserialize
特征。
对于这两个结构,我都有单独的解析函数。由于解析代码几乎相同,我想使用泛型重写它以获得:
parse_cfg_file::<CfgFileWebServer>(path: &Path) -> Result<(), Error> { ... }
parse_cfg_file::<CfgFileFtpServer>(path: &Path) -> Result<(), Error> { ... }
但是我不知道如何使反序列化变量p
( serde_json::from_str
) 通用。我试过以下:
fn parse_cfg_file<T: Deserialize>(path: &Path)
^^^^^^^^^^^ expected lifetime parameter
我应该传递给特征的生命周期是多少?
这是没有泛型的当前实现:
extern crate serde;
extern crate serde_json;
#[macro_use]
extern crate serde_derive;
use serde_json::Error;
#[derive(Serialize, Deserialize)]
struct CfgFileWebServer {
name: String,
/* fields omitted */
}
#[derive(Serialize, Deserialize)]
struct CfgFileFtpServer {
name: String,
/* fields omitted */
}
fn parse_web_server() -> Result<(), Error> {
let data = r#"{
"name": "WebServer",
}"#;
let p: CfgFileWebServer = serde_json::from_str(data)?;
Ok(())
}
fn parse_ftp_server() -> Result<(), Error> {
let data = r#"{
"name": "FTPServer",
}"#;
let p: CfgFileFtpServer = serde_json::from_str(data)?;
Ok(())
}
fn main() {
parse_web_server().unwrap();
parse_ftp_server().unwrap();
}