gpt4 book ai didi

Rust 链接结果(组合器)

转载 作者:行者123 更新时间:2023-12-03 11:25:52 26 4
gpt4 key购买 nike

我一直在关注一个 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 闭包参数 |ld|在 VS Code 中,它说它的类型为 std::string::String
  • 将鼠标悬停在 from_str(&ld) 中的 ld 上我得到消息。
  • 现在我明白了ResultOk 组成和 Err ,但我认为组合子链接会起作用。
  • 编译器建议的修复也不起作用。
  • (或有意义):_::_ 是什么?所有关于?
  • 为什么 Ok不在 from_str 内?

  • 您需要做什么才能使第 2 版正常工作?

  • 这是 Result使用 combinators 的方法在 Rust 文档中。

    cargo .toml
    [dependencies]
    serde = "1.0.115"
    serde_derive = "1.0.115"
    serde_json = "1.0.57"
  • cargo 1.45.1
  • rust 病 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 的函数内部.

    关于Rust 链接结果(组合器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63358858/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com