[英]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.