rust 使用reduce对数组中成员变量求和

jaxagkaj  于 2022-12-29  发布在  其他
关注(0)|答案(2)|浏览(214)

结构体Var的定义如下:

pub struct Var {
    val: i32,
}

我希望将Var数组中的所有val相加:

pub struct Var {
    val: i32,
}

fn main() {
    let var0 = Var { val: 0 };
    let var1 = Var { val: 1 };

    let array = [var0, var1];

    let sum = array.into_iter().reduce(|x, y| Var { val: x.val + y.val });
}

在我看来,这段代码是多余的,因为每次在reduce中添加代码,都会创建一个新的Var。我希望通过只添加val来避免这种浪费,但这是不可能的:

let sum = array.into_iter().reduce(|x, y| x.val + y.val);

应为结构Var,找到的是i32
另一种解决方法是从所有var中获取val,然后将它们相加,这看起来也不太明智:

let vals: Vec<i32> = array.into_iter().map(|var| var.val).collect();
let sum = vals.into_iter().reduce(|x, y| x + y);

有没有一种优雅而有效的方法来对结构体数组中的所有成员变量求和?

owfi6suc

owfi6suc1#

你可以链接迭代器而不需要collect中间结果:

let sum = array.into_iter().map (|var| var.val).reduce(|x, y| x + y);

或者更好的方法是,使用sum代替reduce,使用iter代替into_iter,这样就不会破坏原始阵列:

let sum = array.iter().map (|var| var.val).sum::<i32>();

另一个值得注意的选项是使用fold在单个调用中合并mapsum的效果:

let sum = array.fold (0, |v, s| s + v.val);

注意,reduce对于空数组返回None,对于非空数组返回Some (sum),其他解决方案对于空数组返回0,否则返回裸和。

2vuwiymt

2vuwiymt2#

是的。你可以解构你的结构然后调用sum。

let sum: i32 = vals.into_iter().map(|Var {val}| val).sum();

可以通过fold来缩短时间:

let sum: i32 = vals.into_iter().fold(0, |acc, Var {val}| acc + val);

相关问题