拆分字符串并跳过空子字符串

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)

我的想法是:Splitsplit实现返回的结构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)

那么切片在迭代器中的行为不同吗?

为什么会这样或者我在哪里弄错了?

tre*_*tcl 8

如果只需要省略输入末尾的 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该元素应该被得到。