1.8 KiB
Using #[derive(Sum)]
The derived Sum
implementation will allow an iterator of your type to be
summed together into a new instance of the type with all the fields added
together. Apart from the original types requiring an implementation of Sum
, it
is also required that your type to implements Add
. So normally you want to
derive that one as well.
All this is also true for the Product
, except that then all the fields are
multiplied and an implementation of Mul
is required. This is usually the
easiest to implement by adding #[derive(MulSelf)]
.
Example usage
# use derive_more::{Add, Sum};
#
#[derive(Add, Sum, PartialEq)]
struct MyInts(i32, i64);
let int_vec = vec![MyInts(2, 3), MyInts(4, 5), MyInts(6, 7)];
assert!(MyInts(12, 15) == int_vec.into_iter().sum())
Structs
When deriving Sum
for a struct with two fields its like this:
# use derive_more::{Add, Sum};
#
#[derive(Add, Sum)]
struct MyInts(i32, i64);
Code like this will be generated for the Sum
implementation:
# struct MyInts(i32, i64);
# impl ::core::ops::Add for MyInts {
# type Output = MyInts;
# #[inline]
# fn add(self, rhs: MyInts) -> MyInts {
# MyInts(self.0.add(rhs.0), self.1.add(rhs.1))
# }
# }
impl ::core::iter::Sum for MyInts {
#[inline]
fn sum<I: ::core::iter::Iterator<Item = Self>>(iter: I) -> Self {
iter.fold(
MyInts(
::core::iter::empty::<i32>().sum(),
::core::iter::empty::<i64>().sum(),
),
::core::ops::Add::add,
)
}
}
The trick here is that we get the identity struct by calling sum on empty
iterators.
This way we can get the identity for sum (i.e. 0
) and the identity for product
(i.e. 1
).
Enums
Deriving Sum
for enums is not supported.