Rust,元组向量的类型定义

7
我正在跟随 excism rust track 学习,并遇到了一个问题(我对 rust 很新)。
这是一个用于计算整数的勾股数组函数:
use std::collections::HashSet;
use rayon::prelude::*;

pub fn find(sum: u32) -> HashSet<[u32; 3]> {
    let a_b_plus_c: Vec<(u32; 2)> = (1_u32..(sum / 3_u32)).into_par_iter()
        .filter_map(|a| {
            let b_plus_c: u32 = sum - a;

            let whole_number_check: Option<u32> = (b_plus_c.pow(2) - a.pow(2)).checked_rem(b_plus_c * 2);

            match whole_number_check {
                Some(0) => Some((a, b_plus_c)),
                Some(_) => None,
                None => None,
            }
        }).collect::<Vec<(u32; 2)>>();

    a_b_plus_c.into_par_iter().filter_map(|a, b_plus_c| {
        let b: u32 = (b_plus_c.pow(2) - a.pow(2))/(b_plus_c * 2);
        let c: u32 = b_plus_c - b;

        match b {
            b if b > a => [a, b, c]
            _ => None,
        }}
        ).collect::<HashSet<[u32; 3]>>();

}

或者说,如果它能正常工作的话就好了……
当前问题在于这行代码:
let a_b_plus_c: Vec<(u32; 2)> = (1_u32..(sum / 3_u32)).into_par_iter()

它说在解析 a_b_plus_c 类型时,它期望其中一种符号,但找到了 ; 。从我所看到的(不多),这是定义一个元素类型为 u32 的二元组向量的正确方式。

就像我说的,这是我的学习练习,如果有人能帮助我,我将感激详细的回答 :)

值得一提的是,这可能会对您评论我的代码有所帮助,这是数学:

a + b + c = sum
a² + b² = c²
Rearrange for b:
b = ((b + c)² - a²) / (2(b + c))
So, iterate through a to get b+c, since (b+c) = sum - a
Then solve the above equation to get a, b+c, and b
Confirm that a < b
Then solve for c:
c = (b + c) - b

它应该把它们全部吐出来,放到一个包含数组 a,b,c 的 HashSet 中。

1
要么是(u32, u32),要么是[u32; 2] - hellow
@hellow 后者不会给我一个数组的向量,而不是元组的向量吗? - Alex
它会给你一个由两个u32组成的数组。Vec 是一种类型 - hellow
在我看来,它们是可以互换的 https://dev59.com/j1QJ5IYBdhLWcg3w35-R#52903936 另外,我已经告诉你正确的语法是什么了 ^^ - hellow
1
有趣的是,你根本不需要指定它。你的代码看起来非常不像 Rust,我花了一分钟时间“将其转换为更 Rust 风格的代码”https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=712f64ce51a7590039ad560a6783db7a 正如你所看到的,你根本不需要指定(u32, u32),因为编译器会为你推断类型。我建议你阅读这本书,因为似乎你缺少一些 Rust 的关键特性。尽管如此,祝你玩得愉快! - hellow
显示剩余8条评论
1个回答

4

在定义中,您应该枚举每个元组的元素类型。 这样应该可以工作:

let a_b_plus_c: Vec<(u32, u32)> = (1_u32..(sum / 3_u32)).into_par_iter() 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接