反序列化YAML的“不够通用”错误

问题描述

我是Rust的新手,所以我确定我在这里基本没做过,但是...

我有一个yaml配置文件,我想将其反序列化为一个简单的结构。在较早的版本中,我可以从字符串文字中做到这一点,但是现在我已经将其重构为从文件中读取,我得到了错误implementation of '_::_serde::Deserialize' is not general enough。我的功能如下:

fn read_config(file: &str) -> Result<Config,&'static str> {
    match std::fs::read_to_string(file) {
        Ok(yaml) => match serde_yaml::from_str(&yaml) {
            Ok(c) => c,Err(_) => Err("Failed to parse yaml config."),},Err(_) => Err("Could not open supplied config file"),}
}

read_to_string返回一个Result<String>,但是serde_yaml::from_str的签名需要一个&str,即借用。如上所述,当我借钱时,会出现“不够普遍”的错误。当我搜索错误时,我会看到很多关于反序列化程序如何无法使用借入数据的讨论;我必须先拥有它。那不是原始的String是什么吗?如果from_str不能使用借位,为什么要以&str作为自变量?我在这里想念什么?

解决方法

问题不在于您传递的字符串参数。

根据documentationfrom_str返回Result<T>。在这种情况下,您需要使用T的预期类型调用该函数。在这里是serde_yaml::from_str::<Config>(&yaml)

您还需要修正c的退货声明。不是Ok(c),而是c

,

当然,我缺少一些基本知识。这个问题与借贷或所有权无关。我错过了将最终结果包装在Ok()中的情况,这会弄乱我对from_str的呼叫的类型推断。修改功能:

fn read_config(file: &str) -> Result<Config,&'static str> {    
    match std::fs::read_to_string(file) {        
        Ok(yaml) => match serde_yaml::from_str(&yaml) {
            Ok(c) => Ok(c),Err(_) => Err("Failed to parse yaml config."),},Err(_) => Err("Could not open supplied config file"),}
}