Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust map_err()闭包参数的详细类型是否更少?_Rust - Fatal编程技术网

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 for
TryFrom
的源代码发现的。啊,是的,也很有趣。更多周围的类型说明符有助于推断。到目前为止,谢谢你们两位。这有助于我学习生锈。我从每一个回复中学到了新的东西。将适用于经常使用的错误类型。谢谢
let some_i32: i32 = some_usize
    .try_into()
    .map_err(MyError::from)?;