【问题标题】:Any way to make closure which takes a destructured array?有什么方法可以使闭包采用解构数组?
【发布时间】:2019-08-16 18:34:02
【问题描述】:

我在做this code golf challenge,并想出了这个问题的解决方案:

fn main() {
    let f = |s:&[u8]|s.chunks(2).all(|n|n[0]==n[1]);
    println!("{}", f(b"TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!"));
}

此解决方案有效,但我认为 n[0]==n[1] 看起来不太优雅,并尝试了类似:

fn main() {
    let f = |s:&[u8]|s.chunks(2).all(|[a,b]|a==b);
    println!("{}", f(b"TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!"));
}

但这失败并出现错误:

error[E0005]: refutable pattern in function argument: `&[]` not covered
 --> src/main.rs:2:39
  |
2 |     let f = |s:&[u8]|s.chunks(2).all(|[a,b]|a==b);
  |                                       ^^^^^ pattern `&[]` not covered

有没有办法通过更改闭包参数来完成上述工作(其他一切都应保持原样):

fn main() {
    let f = |s:&[u8]|s.chunks(2).all(|/* anything here */|a==b);
    println!("{}", f(b"TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!"));
}

【问题讨论】:

    标签: parameters rust pattern-matching closures


    【解决方案1】:

    没有。

    函数参数是模式,这些模式必须始终是无可辩驳的。


    使用itertools,您可以这样做:

    use itertools::Itertools;
    
    fn main() {
        let f = |s:&[u8]|s.iter().tuples().all(|(a,b)|a==b);
        println!("{}", f(b"TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!"));
    }
    

    这可以工作,因为tuples 会推断出它恰好需要 2 个元素。如果有奇数个元素,最后一个将被忽略。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 2012-07-25
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      相关资源
      最近更新 更多