[英]Split string and skip empty substrings
我正在学习 Rust 并发现了这个问题:
我想按模式拆分字符串并删除结果 substring 为空的所有情况。
这是一个例子:
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
实现了提供skip_while
的Iterator
。 IntelliSense 告诉我闭包中的x
是&&str
类型,所以我假设迭代器的所有元素(类型&str
)都是空的,可以省略。
但它不会跳过空的 substring。
我还尝试打印is_empty
function 的结果。 它表明最后一个切片确实是空的。 如果我代替 skip_while 使用skip_while(|&x| x == "s")
,它正确地省略了"s"
(在这里用is_empty
打印):
<o>(false) <m>(false) <e>(false) <>(true)
那么切片在迭代器中的行为以某种方式不同?
为什么会这样或者我在哪里弄错了?
如果您只需要在输入末尾省略 1 个空字符串,只需使用split_terminator
而不是split
。 这个适配器基本上就像split
但是它将模式参数视为终止符而不是分隔符,因此输入末尾的空字符串不被视为新元素。
如果您真的想跳过所有空字符串,请继续阅读。
skip_while
完全按照其文档中的说明进行操作(强调我的):
skip_while()
将闭包作为参数。 它将在迭代器的每个元素上调用此闭包,并忽略元素,直到它返回false
。返回
false
后,skip_while()
的工作就结束了,产生了元素的 rest。
过滤掉与谓词匹配的所有元素,无论它们在序列中的哪个位置,都是filter
的工作:
let s = ",s,o,,m,e,";
for elem in s.split(",").filter(|&x| !x.is_empty()) {
print!(" <{}> ", elem);
}
上面的代码会有你想要的效果。
请注意, filter
谓词与skip_while
的含义相反:它不是为不应产生的元素返回true
,而是为应该产生的元素返回true
。
skip_while
忽略元素,直到它返回 false ,也就是说,在您的情况下,它将采用第一个非空字符串之后的所有元素。 例如,给定:
let s = ",,s,o,m,e,";
skip_while
将忽略前两个空字符串,但保留最后一个:
let s = ",,s,o,m,e,";
for elem in s.split(",").skip_while(|&x| x.is_empty()) {
print!(" <{}> ", elem);
}
将打印:
<s> <o> <m> <e> <>
对于您的情况,您似乎只需要filter
:
let s = "s,o,m,e,";
for elem in s.split(",").filter(|&x| !x.is_empty()) {
print!(" <{}> ", elem);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.