rust - 反序列化YAML的“Not general enough”错误

标签 rust serde

我是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的return语句。这将是Ok(c),而不仅仅是c

关于rust - 反序列化YAML的“Not general enough”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63746955/

相关文章:

rust - 我怎样才能让 Serde 在反序列化期间从 arena 分配字符串?

rust - 在编译时使用 serde_json 反序列化文件

windows - 有没有一种方法可以使用rust为Windows设置环境变量

struct - 如何在结构中存储clap::ArgMatches?

rust - 为什么定义 RUSTFLAGS 会导致 .cargo/config 中的 rustflags 被忽略?

rust - Rust Serde反序列化混合数组

rust - 使用 config-rs 将 TOML 字符串反序列化为枚举

rust - 如何从 String.split().collect() 返回数据?

rust - 如何有条件地链接迭代器?

rust - 从 Option<String> 转换为 Option<&str>