首页 > 解决方案 > 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))


我无法从中脱颖而出:

这是Rust 文档中组合子方法的结果。


货运.toml

[dependencies]
serde = "1.0.115"
serde_derive = "1.0.115"
serde_json = "1.0.57"

标签: rustcombinators

解决方案


问题来自and_then通话。

调用时不允许更改错误类型and_then。所以你的函数应该返回一个Result<Vec<Transaction>, String>. 但是,返回的错误类型serde_json::from_strserde_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


推荐阅读