diff options
| author | Jonathan Turner <jonathandturner@users.noreply.github.com> | 2016-08-20 07:09:35 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-20 07:09:35 -0700 |
| commit | a36ff81753165b41eef78fccbde4ea11e2a32d7b (patch) | |
| tree | 63be5c1e97cb7fc1480aa99017db5bbf20d823ff /src/libcore | |
| parent | ad17e0c277b74a33aa8a20f4e66627260bc87232 (diff) | |
| parent | 9563f14eb5d77d992f7cde5db227f8c83351427b (diff) | |
| download | rust-a36ff81753165b41eef78fccbde4ea11e2a32d7b.tar.gz rust-a36ff81753165b41eef78fccbde4ea11e2a32d7b.zip | |
Rollup merge of #35800 - matthew-piziak:mul-div-examples, r=steveklabnik
demonstrate `RHS != Self` use cases for `Mul` and `Div` Vector-scalar multipication is a good usecase for this. Thanks #rust!
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/ops.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index 4ba5993fc61..34d1109577e 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -319,6 +319,37 @@ sub_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 } /// Foo * Foo; /// } /// ``` +/// +/// Note that `RHS = Self` by default, but this is not mandatory. Here is an +/// implementation which enables multiplication of vectors by scalars, as is +/// done in linear algebra. +/// +/// ``` +/// use std::ops::Mul; +/// +/// struct Scalar {value: usize}; +/// +/// #[derive(Debug)] +/// struct Vector {value: Vec<usize>}; +/// +/// impl Mul<Vector> for Scalar { +/// type Output = Vector; +/// +/// fn mul(self, rhs: Vector) -> Vector { +/// Vector {value: rhs.value.iter().map(|v| self.value * v).collect()} +/// } +/// } +/// +/// impl PartialEq<Vector> for Vector { +/// fn eq(&self, other: &Self) -> bool { +/// self.value == other.value +/// } +/// } +/// +/// let scalar = Scalar{value: 3}; +/// let vector = Vector{value: vec![2, 4, 6]}; +/// assert_eq!(scalar * vector, Vector{value: vec![6, 12, 18]}); +/// ``` #[lang = "mul"] #[stable(feature = "rust1", since = "1.0.0")] pub trait Mul<RHS=Self> { @@ -373,6 +404,37 @@ mul_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 } /// Foo / Foo; /// } /// ``` +/// +/// Note that `RHS = Self` by default, but this is not mandatory. Here is an +/// implementation which enables division of vectors by scalars, as is done in +/// linear algebra. +/// +/// ``` +/// use std::ops::Div; +/// +/// struct Scalar {value: f32}; +/// +/// #[derive(Debug)] +/// struct Vector {value: Vec<f32>}; +/// +/// impl Div<Scalar> for Vector { +/// type Output = Vector; +/// +/// fn div(self, rhs: Scalar) -> Vector { +/// Vector {value: self.value.iter().map(|v| v / rhs.value).collect()} +/// } +/// } +/// +/// impl PartialEq<Vector> for Vector { +/// fn eq(&self, other: &Self) -> bool { +/// self.value == other.value +/// } +/// } +/// +/// let scalar = Scalar{value: 2f32}; +/// let vector = Vector{value: vec![2f32, 4f32, 6f32]}; +/// assert_eq!(vector / scalar, Vector{value: vec![1f32, 2f32, 3f32]}); +/// ``` #[lang = "div"] #[stable(feature = "rust1", since = "1.0.0")] pub trait Div<RHS=Self> { |
