如何解决分割字符串并跳过空的子字符串
我正在学习Rust并发现了这个问题:
我想按模式分割字符串,并删除所有resultin子字符串为空的情况。
这里是一个例子:
let s = "s,o,m,e,";
for elem in s.split(",").skip_while(|&x| x.is_empty()) {
print!(" <{}> ",elem);
//print!(" <{}>({}) ",elem,elem.is_empty());
}
但是结果如下:
<s> <o> <m> <e> <>
我的想法是:Split
返回的结构split
实现了Iterator
,它提供了skip_while
。 IntelliSense告诉我闭包中的x
类型为&&str
,所以我假设迭代器(类型&str
)中所有为空的元素都可以省略。
但是它不会跳过空的子字符串。
我还尝试打印is_empty
函数的结果。它表明最后一个切片确实是空的。如果我改为使用skip_while(|&x| x == "s")
来进行skip_while,则正确地排除了"s"
(此处印有is_empty
):
<o>(false) <m>(false) <e>(false) <>(true)
那么切片在迭代器中的表现如何不同?
为什么?或者我在哪里弄错了?
解决方法
如果只需要在输入末尾省略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);
}
上面的代码将具有您想要的效果。
请注意,filter
的谓词与skip_while
的含义相反:它不返回true
表示不产生 的元素,而是返回{ {1}}用于表示应产生 的元素。
skip_while
忽略元素,直到它返回false ,也就是说,在您的情况下,它将接受第一个非空字符串之后的所有元素。例如,给定:
let s = ",";
skip_while
将忽略前两个空字符串,但保留最后一个:
let s = ",").skip_while(|&x| x.is_empty()) {
print!(" <{}> ",elem);
}
将打印:
<s> <o> <m> <e> <>
对于您的情况,看来您只需要filter
:
let s = "s,elem);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。