gpt4 book ai didi

rust - 避免在结果链中多次调用 `map_err`

转载 作者:行者123 更新时间:2023-12-05 03:19:35 29 4
gpt4 key购买 nike

我正在处理一些使用 libgit2 bindings for Rust 的代码在 Git 存储库上执行操作。

我有一段代码可以转换当前看起来像这样的“提交”引用(提交或最终引用提交的内容,如标记):

        let mut target_commit = target_object
.peel(git2::ObjectType::Commit)
.map_err(|_| anyhow!("Target `{commitish}` cannot be evaluated as a commit"))?
.into_commit()
.map_err(|_| anyhow!("Target `{commitish}` cannot be evaluated as a commit"))?;

我想避免对 map_err 进行两次相同的调用链。根据 and_then 组合子的描述...

Calls op if the result is Ok, otherwise returns the Err value of self.

...我想这也许行得通:

        let mut target_commit = target_object
.peel(git2::ObjectType::Commit)
.and_then(|c| c.into_commit())
.map_err(|_| anyhow!("Target `{commitish}` cannot be evaluated as a commit"))?;

但是失败了:

106 |             .and_then(|c| c.into_commit())
| ^^^^^^^^^^^^^^^ expected struct `git2::Error`, found struct `git2::Object`

简化这个表达式的正确方法是什么?

最佳答案

简化可能意味着很多事情。一种简化方法是删除重复的 anyhow!()调用。

由于您实际上并不使用错误信息,因此可以使用 Result::ok 通过转换 Result<T, E> 来丢弃错误信息至 Option<T> , 然后使用 Option::ok_or_else 在链的末端转为最后Option回到Result .

let mut target_commit = target_object
.peel(git2::ObjectType::Commit).ok()
.and_then(|c| c.into_commit().ok())
.ok_or_else(|| anyhow!("Target `{commitish}` cannot be evaluated as a commit"))?;

关于rust - 避免在结果链中多次调用 `map_err`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73430624/

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