Skip to content

Commit 2cad78d

Browse files
replace Div example with something more evocative of division
Analogous to PR #35860. r? @GuillaumeGomez
1 parent 43204ff commit 2cad78d

File tree

1 file changed

+52
-9
lines changed

1 file changed

+52
-9
lines changed

src/libcore/ops.rs

+52-9
Original file line numberDiff line numberDiff line change
@@ -421,25 +421,68 @@ mul_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 }
421421
///
422422
/// # Examples
423423
///
424-
/// A trivial implementation of `Div`. When `Foo / Foo` happens, it ends up
425-
/// calling `div`, and therefore, `main` prints `Dividing!`.
424+
/// Implementing a `Div`idable rational number struct:
426425
///
427426
/// ```
428427
/// use std::ops::Div;
429428
///
430-
/// struct Foo;
429+
/// // The uniqueness of rational numbers in lowest terms is a consequence of
430+
/// // the fundamental theorem of arithmetic.
431+
/// #[derive(Eq)]
432+
/// #[derive(PartialEq, Debug)]
433+
/// struct Rational {
434+
/// nominator: usize,
435+
/// denominator: usize,
436+
/// }
431437
///
432-
/// impl Div for Foo {
433-
/// type Output = Foo;
438+
/// impl Rational {
439+
/// fn new(nominator: usize, denominator: usize) -> Self {
440+
/// if denominator == 0 {
441+
/// panic!("Zero is an invalid denominator!");
442+
/// }
434443
///
435-
/// fn div(self, _rhs: Foo) -> Foo {
436-
/// println!("Dividing!");
437-
/// self
444+
/// // Reduce to lowest terms by dividing by the greatest common
445+
/// // divisor.
446+
/// let gcd = gcd(nominator, denominator);
447+
/// Rational {
448+
/// nominator: nominator / gcd,
449+
/// denominator: denominator / gcd,
450+
/// }
451+
/// }
452+
/// }
453+
///
454+
/// impl Div for Rational {
455+
/// // The division of rational numbers is a closed operation.
456+
/// type Output = Self;
457+
///
458+
/// fn div(self, rhs: Self) -> Self {
459+
/// if rhs.nominator == 0 {
460+
/// panic!("Cannot divide by zero-valued `Rational`!");
461+
/// }
462+
///
463+
/// let nominator = self.nominator * rhs.denominator;
464+
/// let denominator = self.denominator * rhs.nominator;
465+
/// Rational::new(nominator, denominator)
466+
/// }
467+
/// }
468+
///
469+
/// // Euclid's two-thousand-year-old algorithm for finding the greatest common
470+
/// // divisor.
471+
/// fn gcd(x: usize, y: usize) -> usize {
472+
/// let mut x = x;
473+
/// let mut y = y;
474+
/// while y != 0 {
475+
/// let t = y;
476+
/// y = x % y;
477+
/// x = t;
438478
/// }
479+
/// x
439480
/// }
440481
///
441482
/// fn main() {
442-
/// Foo / Foo;
483+
/// assert_eq!(Rational::new(1, 2), Rational::new(2, 4));
484+
/// assert_eq!(Rational::new(1, 2) / Rational::new(3, 4),
485+
/// Rational::new(2, 3));
443486
/// }
444487
/// ```
445488
///

0 commit comments

Comments
 (0)