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该元素应该被得到。