如何解决反序列化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
作为自变量?我在这里想念什么?
解决方法
问题不在于您传递的字符串参数。
根据documentation,from_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"),}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。