Skip to content

Commit d6ab6ed

Browse files
author
Jonathan Turner
authored
Rollup merge of rust-lang#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!
2 parents 598ebb8 + 9563f14 commit d6ab6ed

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

src/libcore/ops.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,37 @@ sub_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 }
319319
/// Foo * Foo;
320320
/// }
321321
/// ```
322+
///
323+
/// Note that `RHS = Self` by default, but this is not mandatory. Here is an
324+
/// implementation which enables multiplication of vectors by scalars, as is
325+
/// done in linear algebra.
326+
///
327+
/// ```
328+
/// use std::ops::Mul;
329+
///
330+
/// struct Scalar {value: usize};
331+
///
332+
/// #[derive(Debug)]
333+
/// struct Vector {value: Vec<usize>};
334+
///
335+
/// impl Mul<Vector> for Scalar {
336+
/// type Output = Vector;
337+
///
338+
/// fn mul(self, rhs: Vector) -> Vector {
339+
/// Vector {value: rhs.value.iter().map(|v| self.value * v).collect()}
340+
/// }
341+
/// }
342+
///
343+
/// impl PartialEq<Vector> for Vector {
344+
/// fn eq(&self, other: &Self) -> bool {
345+
/// self.value == other.value
346+
/// }
347+
/// }
348+
///
349+
/// let scalar = Scalar{value: 3};
350+
/// let vector = Vector{value: vec![2, 4, 6]};
351+
/// assert_eq!(scalar * vector, Vector{value: vec![6, 12, 18]});
352+
/// ```
322353
#[lang = "mul"]
323354
#[stable(feature = "rust1", since = "1.0.0")]
324355
pub trait Mul<RHS=Self> {
@@ -373,6 +404,37 @@ mul_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 }
373404
/// Foo / Foo;
374405
/// }
375406
/// ```
407+
///
408+
/// Note that `RHS = Self` by default, but this is not mandatory. Here is an
409+
/// implementation which enables division of vectors by scalars, as is done in
410+
/// linear algebra.
411+
///
412+
/// ```
413+
/// use std::ops::Div;
414+
///
415+
/// struct Scalar {value: f32};
416+
///
417+
/// #[derive(Debug)]
418+
/// struct Vector {value: Vec<f32>};
419+
///
420+
/// impl Div<Scalar> for Vector {
421+
/// type Output = Vector;
422+
///
423+
/// fn div(self, rhs: Scalar) -> Vector {
424+
/// Vector {value: self.value.iter().map(|v| v / rhs.value).collect()}
425+
/// }
426+
/// }
427+
///
428+
/// impl PartialEq<Vector> for Vector {
429+
/// fn eq(&self, other: &Self) -> bool {
430+
/// self.value == other.value
431+
/// }
432+
/// }
433+
///
434+
/// let scalar = Scalar{value: 2f32};
435+
/// let vector = Vector{value: vec![2f32, 4f32, 6f32]};
436+
/// assert_eq!(vector / scalar, Vector{value: vec![1f32, 2f32, 3f32]});
437+
/// ```
376438
#[lang = "div"]
377439
#[stable(feature = "rust1", since = "1.0.0")]
378440
pub trait Div<RHS=Self> {

0 commit comments

Comments
 (0)