Vec> 的惯用 Rust筛选
对编程非常陌生,出于某种原因,我选择了 rust,但我离题了...
当前代码引用 vec 字符串,将一个“列”与某个数组进行比较,并返回行和截断版本行。
下面的代码可以编译,但我在所有函数中不断重复使用相同的逻辑,并且对于某种闭包来说非常有用。
fn niacs(vec:&Vec<Vec<String>>, naics: Vec<&str> ) -> (Vec<Vec<String>>,Vec<Vec<String>>) {
let mut return_vec_truncated = vec![];
let mut return_vec_full = vec![];
let mut contains_naice = false;
for i in vec.iter() {
for naic in naics.iter(){
if i[31] == *naic {
contains_naice = true;
}
if contains_naice {
let x = info_wanted(&i);
return_vec_truncated.push(x);
return_vec_full.push(i.clone());
}
contains_naice = false;
}
}
(return_vec_full, return_vec_truncated)
}
我想要做的是写一些类似的内容:
let x = vec.iter().map(|x| x.iter()).filter(|x| x != naics);
问题是..我不想映射每个元素的所有元素,我只想在内部 vec 中跨一列,即列31、
Vec的样本Vec:
["471", "001020887", "", "1SNH0", "", "A", "Z2", "20020312", "20210711"、"20200731"、"20200731"、"基准国际有限公司"、""、""、""、"5025 海盗湾路"、""、"杰克逊维尔"、"佛罗里达"、"32210"、 “8309”、“美国”、“04”、 “19990208”、“1231”、“http://www.bmiint.com”、“2L”、“VA”、“美国”、“0005”、“27~2X~A5~QF~XS”、“541611 "、""、"0002"、"541611Y~541690Y"、"0000"、""、"N"、 "", "5025 海盗湾路", "", "杰克逊维尔", "32210", "8309", "美国", "佛罗里达", "安娜", "", "麦肯齐", "", "5025 海盗COVE RD"、""、"杰克逊维尔"、"32210"、"8309"、"美国"、 "FL"、"4437170460"、""、""、""、"[电子邮件受保护]"], ["472", "001021310", "", "94867", "", "A", "Z2", “19980424”、“20210323”、“20200323”、“20200323”、“丘吉尔公司”、“”、“”、“”、“富兰克林街 344 号”、“”、“梅尔罗斯”、“MA”、“02176” 、“1825”、“美国”、“05”、 "19480101"、"0731"、""、"2L"、"MA"、"美国"、"0002"、"2X~MF"、"332322"、""、"0001"、"332322Y"、"0000 "、""、"Y"、""、"POBOX 761038"、""、"梅尔罗斯"、 “02176”、“1825”、“美国”、“MA”、“马歇尔”、“W”、“SCHERMERHORN”、“”、“邮政信箱 761038”、“富兰克林街 344 号”、“梅尔罗斯”、“02176” , "", "美国", "MA", "7816654700", "", "", "7816625291", "[电子邮件受保护]"]]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,确认我没有忽略某些事情:
您的代码等于
并且
contains_naice
是不必要的?除了contains_naice
之外,我认为您的代码易于阅读并且很惯用。如果你绝对想用迭代器编写它,你可以使用
flat_map
和unzip
:虽然我确实想知道:这真的是你想要的吗?您真的想要每个匹配的
naic
一份i
副本吗?或者,如果任何naics
匹配,您是否需要一份i
副本?(相同的迭代代码将在
if
内有一个break
。)First, to confirm that I'm not overlooking something:
Your code is equal to
and the
contains_naice
is unnecessary? Except forcontains_naice
, I think your code easy to read and plenty idiomatic.If you absolutely want to write it with iterators, you can use
flat_map
andunzip
:Though I do wonder: Is that actually what you wanted? Do you really want one copy of
i
per matchingnaic
? Or do you maybe want one copy ofi
if any of thenaics
match?(The equal iterative code would have a
break
inside theif
.)