Rust 映射潜在故障的好方法

Rust 映射潜在故障的好方法,rust,Rust,我正试图解析一系列Json对象,这些对象可能会导致取消整个函数 理想情况下,我会这样做: fn .... -> Result<Vec<Video>, YoutubeParseError> { ... let videos = try!(doc.find("items"). and_then(Json::as_array). ok_or(YoutubeParseError)); Ok(videos.into_i

我正试图解析一系列
Json
对象,这些对象可能会导致取消整个函数

理想情况下,我会这样做:

fn .... -> Result<Vec<Video>, YoutubeParseError> {
    ...
    let videos = try!(doc.find("items").
        and_then(Json::as_array).
        ok_or(YoutubeParseError));

    Ok(videos.into_iter().
        map(|item| try!(json_to_video(item))).
        collect())
}
fn….->结果{
...
让视频=尝试!(doc.find(“项目”)。
然后是_(Json::as_数组)。
ok_或(youtubeparserror));
好的(videos.into_iter()。
映射(| item | try!(json_to_video(item)))。
collect())
}
但是,try当然不会在出现错误时跳过
map()
,而是得到
Vec
,而不是
Result
。我可以将其重写为手动迭代,将元素添加到新的vec中,但我觉得我缺少了一些更简单的处理方法


是否有一些现有函数可以让我轻松地从Iter到结果?

在函数式编程语言中,您可以将选项和结果视为容器,而锈迹是相似的,因此您可以将它们映射为平面映射。您可以使用
平面地图
完成此操作。如果
videos
已经是一个向量,您可以根据
flat\u map
ped length测试
Ok
的预期数量,以决定是否返回
Ok

但是,您应该尽量让事情变得懒惰,并且在第一次失败后不要继续解析<这里可以选择代码>take_,而
。无论哪种方式,您都需要跟踪是否在过程中看到
parse_失败。类似于下面的工作原理—它演示了
flat_map
如何删除
Error
s,但它解析的内容超出了需要。您还可以使用
.filter
然后使用
.map
来获得解析结果

fn get_videos(test: &Vec<&str>) -> Result<Vec<u32>, &'static str> {
    let videos = ...
    let expected = videos.len();
    let extracted = v.into_iter().flat_map(|x| json_to_video(x)).collect();
    if extracted.len() == expected {
        Ok(extracted)
    } else {
        Err("not_ok")
    }
}

您可以调用
unwrap
,因为您从第一次失败开始就放弃了所有内容。现在返回
Ok
如果
extracted.len()==videos.len()

我不认为第二次尝试!你想干什么就干什么。尝试我会帮你摆脱困境的。顺便说一句,你看过《平面地图》
@shepmaster了吗?》在第一次失败后,它会进行解析。啊,这是一个很好的观点!我会澄清我的评论,以免引起任何混乱。
let extracted = videos.map(|x|json_to_video(x))
                      .take_while(|x|x.is_ok())
                      .map(|x|x.ok().unwrap())
                      .collect()