# Trait std::ops::Sub
1.0.0[−][src]

    pub trait Sub<Rhs = Self> {
        type Output;
        fn sub(self, rhs: Rhs) -> Self::Output;
    }

Expand description

The subtraction operator `-`.

Note that `Rhs` is `Self` by default, but this is not mandatory. For example, `std::time::SystemTime` implements `Sub<Duration>`, which permits operations of the form `SystemTime = SystemTime - Duration`.

# Examples

## `Sub`tractable points

    use std::ops::Sub;

    #[derive(Debug, Copy, Clone, PartialEq)]
    struct Point {
        x: i32,
        y: i32,
    }

    impl Sub for Point {
        type Output = Self;

        fn sub(self, other: Self) -> Self::Output {
            Self {
                x: self.x - other.x,
                y: self.y - other.y,
            }
        }
    }

    assert_eq!(Point { x: 3, y: 3 } - Point { x: 2, y: 3 },
               Point { x: 1, y: 0 });

Run

## Implementing `Sub` with generics

Here is an example of the same `Point` struct implementing the `Sub` trait using generics.

    use std::ops::Sub;

    #[derive(Debug, PartialEq)]
    struct Point<T> {
        x: T,
        y: T,
    }

    // Notice that the implementation uses the associated type `Output`.
    impl<T: Sub<Output = T>> Sub for Point<T> {
        type Output = Self;

        fn sub(self, other: Self) -> Self::Output {
            Point {
                x: self.x - other.x,
                y: self.y - other.y,
            }
        }
    }

    assert_eq!(Point { x: 2, y: 3 } - Point { x: 1, y: 0 },
               Point { x: 1, y: 3 });

Run

## Associated Types

[src]
`type Output`

The resulting type after applying the `-` operator.

## Required methods

[src]
`fn sub(self, rhs: Rhs) -> Self::Output`

Performs the `-` operation.

# Example

    assert_eq!(12 - 1, 11);

Run

## Implementors

[src]
`impl Sub<f32> for f32`
[src]
`impl Sub<f64> for f64`
[src]
`impl Sub<i8> for i8`
[src]
`impl Sub<i16> for i16`
[src]
`impl Sub<i32> for i32`
[src]
`impl Sub<i64> for i64`
[src]
`impl Sub<i128> for i128`
[src]
`impl Sub<isize> for isize`
[src]
`impl Sub<u8> for u8`
[src]
`impl Sub<u16> for u16`
[src]
`impl Sub<u32> for u32`
[src]
`impl Sub<u64> for u64`
[src]
`impl Sub<u128> for u128`
[src]
`impl Sub<usize> for usize`
[src]
`impl Sub<Wrapping<i8>> for Wrapping<i8>`
[src]
`impl Sub<Wrapping<i16>> for Wrapping<i16>`
[src]
`impl Sub<Wrapping<i32>> for Wrapping<i32>`
[src]
`impl Sub<Wrapping<i64>> for Wrapping<i64>`
[src]
`impl Sub<Wrapping<i128>> for Wrapping<i128>`
[src]
`impl Sub<Wrapping<isize>> for Wrapping<isize>`
[src]
`impl Sub<Wrapping<u8>> for Wrapping<u8>`
[src]
`impl Sub<Wrapping<u16>> for Wrapping<u16>`
[src]
`impl Sub<Wrapping<u32>> for Wrapping<u32>`
[src]
`impl Sub<Wrapping<u64>> for Wrapping<u64>`
[src]
`impl Sub<Wrapping<u128>> for Wrapping<u128>`
[src]
`impl Sub<Wrapping<usize>> for Wrapping<usize>`
1.3.0[src]
`impl Sub<Duration> for Duration`
1.8.0[src]
`impl Sub<Duration> for Instant`
1.8.0[src]
`impl Sub<Duration> for SystemTime`
1.8.0[src]
`impl Sub<Instant> for Instant`
[src]
`impl<'_> Sub<&'_ f32> for f32`
[src]
`impl<'_> Sub<&'_ f64> for f64`
[src]
`impl<'_> Sub<&'_ i8> for i8`
[src]
`impl<'_> Sub<&'_ i16> for i16`
[src]
`impl<'_> Sub<&'_ i32> for i32`
[src]
`impl<'_> Sub<&'_ i64> for i64`
[src]
`impl<'_> Sub<&'_ i128> for i128`
[src]
`impl<'_> Sub<&'_ isize> for isize`
[src]
`impl<'_> Sub<&'_ u8> for u8`
[src]
`impl<'_> Sub<&'_ u16> for u16`
[src]
`impl<'_> Sub<&'_ u32> for u32`
[src]
`impl<'_> Sub<&'_ u64> for u64`
[src]
`impl<'_> Sub<&'_ u128> for u128`
[src]
`impl<'_> Sub<&'_ usize> for usize`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<i8>> for Wrapping<i8>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<i16>> for Wrapping<i16>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<i32>> for Wrapping<i32>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<i64>> for Wrapping<i64>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<i128>> for Wrapping<i128>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<isize>> for Wrapping<isize>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<u8>> for Wrapping<u8>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<u16>> for Wrapping<u16>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<u32>> for Wrapping<u32>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<u64>> for Wrapping<u64>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<u128>> for Wrapping<u128>`
1.14.0[src]
`impl<'_> Sub<&'_ Wrapping<usize>> for Wrapping<usize>`
[src]
`impl<'_, '_> Sub<&'_ f32> for &'_ f32`
[src]
`impl<'_, '_> Sub<&'_ f64> for &'_ f64`
[src]
`impl<'_, '_> Sub<&'_ i8> for &'_ i8`
[src]
`impl<'_, '_> Sub<&'_ i16> for &'_ i16`
[src]
`impl<'_, '_> Sub<&'_ i32> for &'_ i32`
[src]
`impl<'_, '_> Sub<&'_ i64> for &'_ i64`
[src]
`impl<'_, '_> Sub<&'_ i128> for &'_ i128`
[src]
`impl<'_, '_> Sub<&'_ isize> for &'_ isize`
[src]
`impl<'_, '_> Sub<&'_ u8> for &'_ u8`
[src]
`impl<'_, '_> Sub<&'_ u16> for &'_ u16`
[src]
`impl<'_, '_> Sub<&'_ u32> for &'_ u32`
[src]
`impl<'_, '_> Sub<&'_ u64> for &'_ u64`
[src]
`impl<'_, '_> Sub<&'_ u128> for &'_ u128`
[src]
`impl<'_, '_> Sub<&'_ usize> for &'_ usize`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<i8>> for &'_ Wrapping<i8>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<i16>> for &'_ Wrapping<i16>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<i32>> for &'_ Wrapping<i32>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<i64>> for &'_ Wrapping<i64>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<i128>> for &'_ Wrapping<i128>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<isize>> for &'_ Wrapping<isize>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<u8>> for &'_ Wrapping<u8>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<u16>> for &'_ Wrapping<u16>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<u32>> for &'_ Wrapping<u32>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<u64>> for &'_ Wrapping<u64>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<u128>> for &'_ Wrapping<u128>`
1.14.0[src]
`impl<'_, '_> Sub<&'_ Wrapping<usize>> for &'_ Wrapping<usize>`
[src]
`impl<'_, '_, T> Sub<&'_ BTreeSet<T>> for &'_ BTreeSet<T> where
T: Ord + Clone,`
[src]
`impl<'a> Sub<f32> for &'a f32`
[src]
`impl<'a> Sub<f64> for &'a f64`
[src]
`impl<'a> Sub<i8> for &'a i8`
[src]
`impl<'a> Sub<i16> for &'a i16`
[src]
`impl<'a> Sub<i32> for &'a i32`
[src]
`impl<'a> Sub<i64> for &'a i64`
[src]
`impl<'a> Sub<i128> for &'a i128`
[src]
`impl<'a> Sub<isize> for &'a isize`
[src]
`impl<'a> Sub<u8> for &'a u8`
[src]
`impl<'a> Sub<u16> for &'a u16`
[src]
`impl<'a> Sub<u32> for &'a u32`
[src]
`impl<'a> Sub<u64> for &'a u64`
[src]
`impl<'a> Sub<u128> for &'a u128`
[src]
`impl<'a> Sub<usize> for &'a usize`
1.14.0[src]
`impl<'a> Sub<Wrapping<i8>> for &'a Wrapping<i8>`
1.14.0[src]
`impl<'a> Sub<Wrapping<i16>> for &'a Wrapping<i16>`
1.14.0[src]
`impl<'a> Sub<Wrapping<i32>> for &'a Wrapping<i32>`
1.14.0[src]
`impl<'a> Sub<Wrapping<i64>> for &'a Wrapping<i64>`
1.14.0[src]
`impl<'a> Sub<Wrapping<i128>> for &'a Wrapping<i128>`
1.14.0[src]
`impl<'a> Sub<Wrapping<isize>> for &'a Wrapping<isize>`
1.14.0[src]
`impl<'a> Sub<Wrapping<u8>> for &'a Wrapping<u8>`
1.14.0[src]
`impl<'a> Sub<Wrapping<u16>> for &'a Wrapping<u16>`
1.14.0[src]
`impl<'a> Sub<Wrapping<u32>> for &'a Wrapping<u32>`
1.14.0[src]
`impl<'a> Sub<Wrapping<u64>> for &'a Wrapping<u64>`
1.14.0[src]
`impl<'a> Sub<Wrapping<u128>> for &'a Wrapping<u128>`
1.14.0[src]
`impl<'a> Sub<Wrapping<usize>> for &'a Wrapping<usize>`
[src]
`impl<T, S> Sub<&'_ HashSet<T, S>> for &HashSet<T, S> where
T: Eq + Hash + Clone,
S: BuildHasher + Default,`