Module ops
Overloadable operators.
Implementing these traits allows you to overload certain operators.
Some of these traits are imported by the prelude, so they are available in
every Rust program. Only operators backed by traits can be overloaded. For
example, the addition operator (+) can be overloaded through the Add
trait, but since the assignment operator (=) has no backing trait, there
is no way of overloading its semantics. Additionally, this module does not
provide any mechanism to create new operators. If traitless overloading or
custom operators are required, you should look toward macros to extend
Rust's syntax.
Implementations of operator traits should be unsurprising in their
respective contexts, keeping in mind their usual meanings and
operator precedence. For example, when implementing Mul, the operation
should have some resemblance to multiplication (and share expected
properties like associativity).
Note that the && and || operators are currently not supported for
overloading. Due to their short circuiting nature, they require a different
design from traits for other operators like BitAnd. Designs for them are
under discussion.
Many of the operators take their operands by value. In non-generic
contexts involving built-in types, this is usually not a problem.
However, using these operators in generic code, requires some
attention if values have to be reused as opposed to letting the operators
consume them. One option is to occasionally use clone.
Another option is to rely on the types involved providing additional
operator implementations for references. For example, for a user-defined
type T which is supposed to support addition, it is probably a good
idea to have both T and &T implement the traits [Add<T>]Add and
[Add<&T>]Add so that generic code can be written without unnecessary
cloning.
Examples
This example creates a Point struct that implements Add and Sub,
and then demonstrates adding and subtracting two Points.
use ;
assert_eq!;
assert_eq!;
See the documentation for each trait for an example implementation.
The Fn, FnMut, and FnOnce traits are implemented by types that can be
invoked like functions. Note that Fn takes &self, FnMut takes &mut self and FnOnce takes self. These correspond to the three kinds of
methods that can be invoked on an instance: call-by-reference,
call-by-mutable-reference, and call-by-value. The most common use of these
traits is to act as bounds to higher-level functions that take functions or
closures as arguments.
Taking a Fn as a parameter:
let double = ;
assert_eq!;
Taking a FnMut as a parameter:
let mut x: usize = 1;
assert_eq!;
Taking a FnOnce as a parameter:
let x = Stringfrom;
let consume_and_return_x = move || x;
consume_with_relish;
// `consume_and_return_x` can no longer be invoked at this point