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()