rust - Rust 链接结果(组合器)
问题描述
我一直在关注一个 Rust 教程,其中声称一个函数的两个版本可以生成相同的结果:
版本 1:
pub fn get_transactions(fname:&str) -> Result<Vec<Transaction>,String> {
let s = match std::fs::read_to_string(fname){
Ok(v)=>v,
Err(e)=> return Err(e.to_string()),
};
let t:Vec<Transaction> = match serde_json::from_str(&s) {
Ok(v)=>v,
Err(e)=> return Err(e.to_string()),
};
Ok(t)
}
版本 2:
fn get_transactions_b(fname:&str) -> Result<Vec<Transaction>,String> {
std::fs::read_to_string(fname)
.map_err(|e| e.to_string())
.and_then(|ld| serde_json::from_str(&ld) )
.map_err(|e| e.to_string())
}
但是,我收到版本 2 的以下消息:
不匹配的类型
预期结构std::string::String
,找到结构serde_json::error::Error
注意:预期枚举std::result::Result<_, std::string::String>
找到枚举std::result::Result<_, serde_json::error::Error>
帮助:尝试使用预期枚举的变体:_::_serde::export::Ok(serde_json::from_str(&ld))
,
我无法从中脱颖而出:
将鼠标悬停
|ld|
在 VS Code 中的 ld 闭包参数上,它表示它的类型std::string::String
将鼠标悬停在
from_str(&ld)
我收到消息的 ld 上。现在我知道 a
Result
由 anOk
和 an组成Err
,但我认为组合子链会起作用。编译器建议的修复也不起作用。
- (或有道理):到底是怎么
_::_
回事? - 为什么
Ok
不在 from_str 内?
- (或有道理):到底是怎么
您需要做什么才能使第 2 版正常工作?
货运.toml
[dependencies]
serde = "1.0.115"
serde_derive = "1.0.115"
serde_json = "1.0.57"
- 货物 1.45.1
- 锈病 1.45.2
解决方案
问题来自and_then
通话。
调用时不允许更改错误类型and_then
。所以你的函数应该返回一个Result<Vec<Transaction>, String>
. 但是,返回的错误类型serde_json::from_str
是serde_json::error::Error
.
你可以像这样修复它:
std::fs::read_to_string(fname)
.map_err(|e| e.to_string())
.and_then(|ld| serde_json::from_str(&ld).map_err(|e| e.to_string()))
请注意,对的调用map_err
现在在传递给的函数内部and_then
。
推荐阅读
- reactjs - 如何在不同文件中的史诗之间共享变量?
- java - 如何提取具有特定标题名称的 CSV 列并输出到新文件?
- oracle - 如何使用 Instant Client 连接到 ADB?
- r - 如何重新排列列,使具有相似名称的列并排
- javascript - 如何将 react 项目添加到现有的 jquery/vanilla js 项目中?
- ajax - 使用 onclick 更新
- discord - 嵌入字段 URL 不和谐 js
- c# - .NET 5 在使用 EF Core Power Tools 时正确注入 DbContext 连接字符串
- networking - 可以连接wan到lan吗?
- react-native - 屏幕中的两个部分并通过在本机中滑动来改变高度