【问题标题】:Split string and skip empty substrings拆分字符串并跳过空子字符串
【发布时间】:2020-12-01 08:19:06
【问题描述】:

我在学习 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());
}

但结果如下:

 <s>  <o>  <m>  <e>  <> 

我的想法是:split 返回的结构体Split 实现了Iterator,它提供了skip_while。 IntelliSense 告诉我闭包中的x&amp;&amp;str 类型,所以我假设迭代器的所有元素(&amp;str 类型)都是空的,可以省略。

但它不会跳过空子字符串。

我还尝试打印is_empty 函数的结果。它表明最后一个切片确实是空的。如果我改为使用skip_while(|&amp;x| x == "s") 代替skip_while,它正确地省略了"s"(此处用is_empty 打印):

 <o>(false)  <m>(false)  <e>(false)  <>(true)

所以切片在迭代器中的行为会有所不同?

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

【问题讨论】:

    标签: string rust iterator


    【解决方案1】:

    如果只需要省略输入末尾的1个空字符串,只需使用split_terminator而不是split。这个适配器基本上就像split,但它将模式参数视为终止符而不是分隔符,因此输入末尾的空字符串不会被视为新元素。

    如果您真的想跳过所有空字符串,请继续阅读。


    skip_while 完全按照文档中的说明进行操作(强调我的):

    skip_while() 将闭包作为参数。它将在迭代器的每个元素上调用这个闭包,并忽略元素直到它返回false

    false返回后,skip_while()的工作就结束了,剩下的元素都yield了。

    过滤掉所有匹配谓词的元素,不管它们在序列中的什么位置,是filter的工作:

    let s = ",s,o,,m,e,";
    for elem in s.split(",").filter(|&x| !x.is_empty()) {
        print!(" <{}> ", elem);
    }
    

    上面的代码会有你想要的效果。

    请注意,filter 的谓词与skip_while 的含义相反:它不是为不应该产生的元素返回true,而是为的元素返回true em>应该屈服。

    【讨论】:

      【解决方案2】:

      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);
      }
      

      Playground

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-28
        • 2021-07-17
        • 1970-01-01
        • 2013-05-21
        • 2019-10-11
        • 1970-01-01
        • 2018-09-07
        相关资源
        最近更新 更多