< 返回版块

freakcoco 发表于 2019-12-22 16:55

要如何给lambda输入值型别? 我开始进入rust世界, 我尝试写写看以前大学写过得作业。 这一个是算Munchausen数。

use rayon::prelude::*;
fn main() {
    let answer:Vec<i32> = (1..100000000)
        .into_par_iter()
        .filter(|&p| -> bool { 
                p.to_string().chars()
                .map(|c :char| -> u32 { c.to_digit(10).unwrap() })
                .map(|d :u32| -> i32 { (d as f64).powi(d as i32) as i32  })
                .sum::<i32>()
                == p 
        })
    .collect();
    println!("Munchausen numbers {:?}", answer );
}

拋出錯誤

.filter(|&p| -> bool {
   |                  ^^ consider giving this closure parameter the explicit type &_, with the type parameters specified

把它拿出来就ok了!

use rayon::prelude::*;
fn power_sum(p:i32) -> i32 {
    return p.to_string().chars()
        .map(|c :char| -> u32 {c.to_digit(10).unwrap() })
        .map(|d :u32| -> i32 { (d as f64).powi(d as i32) as i32  })
        .sum::<i32>();
}


fn main() {
    let answer:Vec<i32> = (1..100000000)
        .into_par_iter()
        .filter(|&p| -> bool { power_sum(p) == p })
        .collect();
    println!("{:?}", answer );
}

一般要如何给 closure parameter 型别! ?还是有其他方法处理这错误?

ps: code 缩排都乱了....

评论区

写评论
chirsz-ever 2019-12-23 00:53

本论坛使用 Markdown 格式,代码块应该包在 ``` 里。

你的代码的问题是编译器无法推断 (1..10000) 的类型,只要指定就好了:

use rayon::prelude::*;
fn main() {
    let answer: Vec<_> = (1..100000000i32)
        .into_par_iter()
        .filter(|&p| {
            p.to_string()
                .chars()
                .map(|c: char| -> u32 { c.to_digit(10).unwrap() })
                .map(|d: u32| -> i32 { (d as f64).powi(d as i32) as i32 })
                .sum::<i32>()
                == p
        })
        .collect();
    println!("Munchausen numbers {:?}", answer);
}

至于 closure 的参数类型,直接用冒号即可

|p:i32| {...}
1 共 1 条评论, 1 页