Rust map_err()闭包参数的详细类型是否更少?
在Rust map_err()闭包参数的详细类型是否更少?,rust,Rust,在map\u 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
map\u 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(())
}
使用std::convert::TryInto;
#[导出(调试)]
结构MyError{
pub-msg:String
}
fn main()->std::result::result{
让一些人使用:usize=0;
让some_i32:i32=some_使用
.试试看
.map_err(| err:::Error | MyError{msg:err.to_string()?;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//删除这个,它就不会编译。
好(())
}
当然,代码
some\u i32=some\u usize as i32
可以工作,令人惊讶的是,使用i32::try\u from(some\u usize)。map\u err(…)
可以推断err
的类型。所以,我确实有其他选择,但我仍然好奇我的问题是否有答案。您可以使用std::num::tryFromInteror
。它不会阻止类型注释,但会使它更容易接受
use std::convert::TryInto;
use std::num::TryFromIntError;
#[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: TryFromIntError| MyError{ msg: err.to_string()})?;
Ok(())
}
使用std::convert::TryInto;
使用std::num::tryFromInteror;
#[导出(调试)]
结构MyError{
pub-msg:String
}
fn main()->std::result::result{
让一些人使用:usize=0;
让some_i32:i32=some_使用
.试试看
.map_err(| err:tryFromInteror | MyError{msg:err.to_string()?;
好(())
}
您可以通过拆分有问题的行并包含类型注释来帮助Rust进行类型推断
使用std::convert::TryInto;
#[导出(调试)]
结构MyError{
pub-msg:String
}
fn main()->std::result::result{
让一些人使用:usize=0;
让一些人使用:结果=一些人使用
.试试看;
让some_i32=some_i32
.map_err(| err | MyError{msg:err.to_string()?;
好(())
}
但老实说,我建议只使用try\u from
而不是try\u into
让some\u i32=i32::从(some\u usize)尝试
.map_err(| err | MyError{msg:err.to_string()?;
您可以为错误类型实现From
特性
impl From<std::num::TryFromIntError> for MyError {
fn from (err: std::num::TryFromIntError) -> Self {
Self{
msg: err.to_string()
}
}
}
这还允许对要映射到
MyError
的多个类型实现From
特性,谢谢!我不会将这个(或任何)标记为被接受的答案,因为下一个建议同样有趣。您是在文档中找到这个tryFromInteror的,还是碰巧(从其他代码中)知道的?我是通过查看i32
的impl forTryFrom
的源代码发现的。啊,是的,也很有趣。更多周围的类型说明符有助于推断。到目前为止,谢谢你们两位。这有助于我学习生锈。我从每一个回复中学到了新的东西。将适用于经常使用的错误类型。谢谢
let some_i32: i32 = some_usize
.try_into()
.map_err(MyError::from)?;