"Not general enough" 反序列化 YAML 时出错

"Not general enough" error deserializing 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_stringreturns一个Result<String>,但是serde_yaml::from_str的签名要一个&str,也就是借。如上所述,当我借用它时,出现“不够通用”的错误。当我 google 那个错误时,我看到很多关于反序列化器如何不能使用借用数据的讨论;我必须先拥有它。原来的 String 不就是这样吗?如果 from_str 不能使用借位,为什么它需要 &str 作为参数?我在这里错过了什么?

果然,我错过了一些基本的东西。这个问题与借用或所有权无关。我错过了将最终结果包装在 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"),
    }
}

问题不是你传递的字符串参数。

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

您还需要为 c 修正 return 语句。它将是 Ok(c),而不仅仅是 c