Ger*_*ero 4 string iterator rust
我正在学习 Rust 并发现了这个问题:
我想按模式拆分字符串并删除结果子字符串为空的所有情况。
下面是一个例子:
let s = "s,o,m,e,";
for elem in s.split(",").skip_while(|&x| x.is_empty()) {
print!(" <{}> ", elem);
//print!(" <{}>({}) ", elem, elem.is_empty());
}
Run Code Online (Sandbox Code Playgroud)
但结果如下:
<s> <o> <m> <e> <>
Run Code Online (Sandbox Code Playgroud)
我的想法是:Split由split实现返回的结构Iterator提供skip_while. IntelliSense 告诉我xin 闭包是 type ,&&str所以我假设迭代器( type &str)的所有元素都是空的被省略。
但它不会跳过空子字符串。
我还尝试打印is_empty函数的结果。它表明最后一个切片确实是空的。如果我改为使用 skip_while skip_while(|&x| x == "s"),它会正确地省略"s"(在is_empty此处打印):
<o>(false) <m>(false) <e>(false) <>(true)
Run Code Online (Sandbox Code Playgroud)
那么切片在迭代器中的行为不同吗?
为什么会这样或者我在哪里弄错了?
如果只需要省略输入末尾的 1 个空字符串,只需使用split_terminator代替split。这个适配器基本上就像split但它将模式参数视为终止符而不是分隔符,因此输入末尾的空字符串不被视为新元素。
如果您真的想跳过所有空字符串,请继续阅读。
skip_while 完全按照它的文档说的做(强调我的):
skip_while()将闭包作为参数。它将在迭代器的每个元素上调用这个闭包,并忽略元素直到它返回false。后
false返回,skip_while()的工作已经结束,而其余元素都产生。
过滤掉与谓词匹配的所有元素,无论它们在序列中的位置,是filter:
let s = ",s,o,,m,e,";
for elem in s.split(",").filter(|&x| !x.is_empty()) {
print!(" <{}> ", elem);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码就会有你想要的效果。
请注意,谓词filter有相反的含义skip_while:而不是返回true该元素不应该被产生,它返回true该元素应该被得到。
| 归档时间: |
|
| 查看次数: |
861 次 |
| 最近记录: |