Skip to content

Commit 38f0bca

Browse files
replace Mul example with something more evocative of multiplication
I may have gone a bit overboard on this one. Numbers are fun. tone down the error message
1 parent 11f8805 commit 38f0bca

File tree

1 file changed

+47
-10
lines changed

1 file changed

+47
-10
lines changed

src/libcore/ops.rs

+47-10
Original file line numberDiff line numberDiff line change
@@ -274,26 +274,63 @@ sub_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 }
274274
///
275275
/// # Examples
276276
///
277-
/// A trivial implementation of `Mul`. When `Foo * Foo` happens, it ends up
278-
/// calling `mul`, and therefore, `main` prints `Multiplying!`.
277+
/// Implementing a `Mul`tipliable rational number struct:
279278
///
280279
/// ```
281280
/// use std::ops::Mul;
282281
///
283-
/// struct Foo;
282+
/// // The uniqueness of rational numbers in lowest terms is a consequence of
283+
/// // the fundamental theorem of arithmetic.
284+
/// #[derive(Eq)]
285+
/// #[derive(PartialEq, Debug)]
286+
/// struct Rational {
287+
/// nominator: usize,
288+
/// denominator: usize,
289+
/// }
290+
///
291+
/// impl Rational {
292+
/// fn new(nominator: usize, denominator: usize) -> Self {
293+
/// if denominator == 0 {
294+
/// panic!("Zero is an invalid denominator!");
295+
/// }
296+
///
297+
/// // Reduce to lowest terms by dividing by the greatest common
298+
/// // divisor.
299+
/// let gcd = gcd(nominator, denominator);
300+
/// Rational {
301+
/// nominator: nominator / gcd,
302+
/// denominator: denominator / gcd,
303+
/// }
304+
/// }
305+
/// }
284306
///
285-
/// impl Mul for Foo {
286-
/// type Output = Foo;
307+
/// impl Mul for Rational {
308+
/// // The multiplication of rational numbers is a closed operation.
309+
/// type Output = Self;
287310
///
288-
/// fn mul(self, _rhs: Foo) -> Foo {
289-
/// println!("Multiplying!");
290-
/// self
311+
/// fn mul(self, rhs: Self) -> Self {
312+
/// let nominator = self.nominator * rhs.nominator;
313+
/// let denominator = self.denominator * rhs.denominator;
314+
/// Rational::new(nominator, denominator)
291315
/// }
292316
/// }
293317
///
294-
/// fn main() {
295-
/// Foo * Foo;
318+
/// // Euclid's two-thousand-year-old algorithm for finding the greatest common
319+
/// // divisor.
320+
/// fn gcd(x: usize, y: usize) -> usize {
321+
/// let mut x = x;
322+
/// let mut y = y;
323+
/// while y != 0 {
324+
/// let t = y;
325+
/// y = x % y;
326+
/// x = t;
327+
/// }
328+
/// x
296329
/// }
330+
///
331+
/// assert_eq!(Rational::new(1, 2), Rational::new(2, 4));
332+
/// assert_eq!(Rational::new(2, 3) * Rational::new(3, 4),
333+
/// Rational::new(1, 2));
297334
/// ```
298335
#[lang = "mul"]
299336
#[stable(feature = "rust1", since = "1.0.0")]

0 commit comments

Comments
 (0)