gpt4 book ai didi

rust - map_err() 闭包参数的更简洁类型?

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

有没有更简洁的方法来为 map_err() 中的闭包指定 err 参数的类型?在许多其他情况下,类型是推断出来的。

use std::convert::TryInto;
#[derive(Debug)]
struct MyError {
pub msg: String
}

fn main() -> std::result::Result<(), MyError> {
let some_usize: usize = 0;
let some_i32: i32 = some_usize
.try_into()
.map_err(|err: <i32 as std::convert::TryFrom<usize>>::Error| MyError{ msg: err.to_string()})?;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// remove this and it doesn't compile.
Ok(())
}

当然,代码 some_i32 = some_usize as i32 有效,而且令人惊讶的是,使用 i32::try_from(some_usize).map_err(...) 确实推断出err 的类型。所以,我确实有其他选择,但我仍然很好奇我的问题是否有答案。

最佳答案

您可以为您的错误类型实现 From 特征。

impl From<std::num::TryFromIntError> for MyError {
fn from (err: std::num::TryFromIntError) -> Self {
Self{
msg: err.to_string()
}
}
}

然后传入MyError::frommap_err

let some_i32: i32 = some_usize
.try_into()
.map_err(MyError::from)?;

这也允许为您想要映射到 MyError 的多种类型实现 From 特性。

关于rust - map_err() 闭包参数的更简洁类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62238827/

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