1

我正在重构一些 Rust 代码(见下文)以使用serdecrate 解析各种配置文件(在 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();
}
4

0 回答 0