Rust 将结果上的迭代器转换为结果<;Vec<_>_&燃气轮机;

Rust 将结果上的迭代器转换为结果<;Vec<_>_&燃气轮机;,rust,Rust,我试图编写一个函数,将Result的输出转换为Result。我有自己的Error类型,它为glob::GlobError和glob::PatternError实现From。目前,我已实施以下措施: fn全局路径(fpath:&str)->结果{ Ok(全局(fpath)?.map(|val | val.unwrap()).collect::()) } 我正在寻找的是一种方法,可以删除对val.unwrap的调用,并允许在遇到GlobError时返回该调用。我尝试使用collect::()?,但

我试图编写一个函数,将
Result
的输出转换为
Result
。我有自己的
Error
类型,它为
glob::GlobError
glob::PatternError
实现
From
。目前,我已实施以下措施:

fn全局路径(fpath:&str)->结果{
Ok(全局(fpath)?.map(|val | val.unwrap()).collect::())
}
我正在寻找的是一种方法,可以删除对
val.unwrap
的调用,并允许在遇到
GlobError
时返回该调用。我尝试使用
collect::()?
,但没有成功


如果问题标题含糊不清,请道歉。我是个新手,还不熟悉如何简明扼要地表达这个问题。

这里有几个问题:

fn全局路径(fpath:&str)->std::result::result{
Ok(全局(fpath)?.map(|val | val.unwrap()).collect::())
}
glob\u abs\u path
的末尾,您正在将值收集到
Vec
中。如果您尝试在vec上使用
运算符,它将失败:

error[E0277]“?”运算符只能应用于实现“std::ops::Try”的值`
-->src/lib.rs:26:8
|
26 | Ok(glob(fpath)?.map(| val | val.unwrap())。collect::()?)
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^无法应用“?”运算符
键入'std::vec::vec'`
运算符只能应用于实现
std::ops::Try
的值,即
Result
。因此,我们要做的是将迭代器收集到
结果中:

fn全局路径(fpath:&str)->std::result::result{
Ok(全局(fpath)?.map(|val | val.unwrap()).collect::()?)
}
然而,我们在这里得到另一个错误:

error[E0277]:无法生成'std::result::result'类型的值
从“std::path::PathBuf”类型元素的迭代器`
-->src/lib.rs:26:43
|
26 | Ok(glob(fpath)?.map(| val | val.unwrap())。collect::())
|^^^^^^^^类型的值
|无法从中生成'std::result::result'
|`std::iter::迭代器`
|
这里的问题是,我们在收集值
.map(|val | val.unwrap())
之前将其展开,迭代器不知道如何将展开的值(
PathBuf
)转换为
结果。删除展开调用可修复此问题:

fn全局路径(fpath:&str)->std::result::result{
Ok(全局(fpath)?。收集::()?)
}
代码现在可以编译了。您提到您有一个
Result
的类型别名:

键入MyResult=std::result::result
可以在返回值中使用此类型别名:

fn全局路径(fpath:&str)->MyResult{
Ok(全局(fpath)?。收集::()?)
}
但是,在中使用它来收集迭代器时:

fn全局路径(fpath:&str)->MyResult{
Ok(全局(fpath)?。收集::()?)
}
它失败了:

error[E0277]:类型为'std::result::result'的值
无法从“std::result::result”类型的元素上的迭代器生成`
-->src/lib.rs:26:21
|
26 | Ok(全局(fpath)?。收集::()?)
|^^^^^^类型为'std::result::result'的值
|无法从'std::iter::Iterator'生成`
|
这是因为
MyResult
明确地将返回值声明为自定义错误类型<代码>迭代器
无法将
全局错误
转换为您的
错误
。该转换由
运算符处理:

fn全局路径(fpath:&str)->MyResult{
Ok(全局(fpath)?。收集::()?)
}

正如您在上面看到的,迭代器被收集到
“我尝试使用
收集::()?
,但没有成功”-因为
结果
有两个类型参数
collect::
(注意第二个下划线)应该可以。
collect::()?
产生了一个与我到目前为止所看到的类似的错误:
类型为“std::result::result”的值不能从类型为“std::result::result”的元素的迭代器中生成。
,也许我遗漏了什么?@kmdreko一些可疑的事情。您是对的,代码片段中没有错误。这与我的唯一区别在于我定义了
type Result=std::Result::Result
,因此函数返回是
Result
。当我使用自己的
结果
定义时,我仍然会得到一个错误-您正在收集
结果
,但只有当迭代器项是
结果
时才有可能。当您采集到
Result
并在采集后转换错误时,它会工作-。