【问题标题】:"Not general enough" error deserializing YAML反序列化 YAML 时出现“不够通用”错误
【发布时间】:2020-09-04 19:21:43
【问题描述】:

我是 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&lt;String&gt;,但serde_yaml::from_str 的签名想要一个&amp;str,即借用。当我借用它时,如上所述,我得到“不够通用”的错误。当我用谷歌搜索那个错误时,我看到很多关于反序列化器如何不能使用借来的数据的讨论;我必须先拥有它。这不就是原来的String吗?如果from_str 不能使用借位,为什么要使用&amp;str 作为参数?我在这里错过了什么?

【问题讨论】:

    标签: rust serde


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,正如您发布的那样,我想通了。如果返回是固定的,::&lt;Config&gt; 是多余的,但仅此而已。谢谢!
    • 我发布的答案太晚了,看来您已经找到了解决方案。没错,类型推断没有发生是因为return语句,确实是多余的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多