std::ops::IndexMut - Rust
Description: API documentation for the Rust `IndexMut` trait in crate `std`.
Keywords: rust, rustlang, rust-lang, IndexMut

# Trait std::ops::IndexMut 1.0.0 [−] [src]

    pub trait IndexMut<Idx>: Index<Idx> where Idx: ?Sized {
        fn index_mut(&mut self, index: Idx) -> &mut Self::Output;
    }

The `IndexMut` trait is used to specify the functionality of indexing operations like `container[index]` when used in a mutable context.

`container[index]` is actually syntactic sugar for `*container.index_mut(index)`, but only when used as a mutable value. If an immutable value is requested, the `Index` trait is used instead. This allows nice things such as `v[index] = value` if `value` implements `Copy`.

# Examples

A very simple implementation of a `Balance` struct that has two sides, where each can be indexed mutably and immutably.

    use std::ops::{Index,IndexMut};

    #[derive(Debug)]
    enum Side {
        Left,
        Right,
    }

    #[derive(Debug, PartialEq)]
    enum Weight {
        Kilogram(f32),
        Pound(f32),
    }

    struct Balance {
        pub left: Weight,
        pub right:Weight,
    }

    impl Index<Side> for Balance {
        type Output = Weight;

        fn index<'a>(&'a self, index: Side) -> &'a Weight {
            println!("Accessing {:?}-side of balance immutably", index);
            match index {
                Side::Left => &self.left,
                Side::Right => &self.right,
            }
        }
    }

    impl IndexMut<Side> for Balance {
        fn index_mut<'a>(&'a mut self, index: Side) -> &'a mut Weight {
            println!("Accessing {:?}-side of balance mutably", index);
            match index {
                Side::Left => &mut self.left,
                Side::Right => &mut self.right,
            }
        }
    }

    fn main() {
        let mut balance = Balance {
            right: Weight::Kilogram(2.5),
            left: Weight::Pound(1.5),
        };

        // In this case balance[Side::Right] is sugar for
        // *balance.index(Side::Right), since we are only reading
        // balance[Side::Right], not writing it.
        assert_eq!(balance[Side::Right],Weight::Kilogram(2.5));

        // However in this case balance[Side::Left] is sugar for
        // *balance.index_mut(Side::Left), since we are writing
        // balance[Side::Left].
        balance[Side::Left] = Weight::Kilogram(3.0);
    }Run

## Required Methods

### `fn index_mut(&mut self, index: Idx) -> &mut Self::Output`

The method for the mutable indexing (`container[index]`) operation

## Implementors

- `impl<T> IndexMut<usize> for [T]`
- `impl<T> IndexMut<Range<usize>> for [T]`
- `impl<T> IndexMut<RangeTo<usize>> for [T]`
- `impl<T> IndexMut<RangeFrom<usize>> for [T]`
- `impl<T> IndexMut<RangeFull> for [T]`
- `impl<T> IndexMut<RangeInclusive<usize>> for [T]`
- `impl<T> IndexMut<RangeToInclusive<usize>> for [T]`
- `impl IndexMut<Range<usize>> for str`
- `impl IndexMut<RangeTo<usize>> for str`
- `impl IndexMut<RangeFrom<usize>> for str`
- `impl IndexMut<RangeFull> for str`
- `impl IndexMut<RangeInclusive<usize>> for str`
- `impl IndexMut<RangeToInclusive<usize>> for str`
- `impl IndexMut<Range<usize>> for String`
- `impl IndexMut<RangeTo<usize>> for String`
- `impl IndexMut<RangeFrom<usize>> for String`
- `impl IndexMut<RangeFull> for String`
- `impl IndexMut<RangeInclusive<usize>> for String`
- `impl IndexMut<RangeToInclusive<usize>> for String`
- `impl<T> IndexMut<usize> for Vec<T>`
- `impl<T> IndexMut<Range<usize>> for Vec<T>`
- `impl<T> IndexMut<RangeTo<usize>> for Vec<T>`
- `impl<T> IndexMut<RangeFrom<usize>> for Vec<T>`
- `impl<T> IndexMut<RangeFull> for Vec<T>`
- `impl<T> IndexMut<RangeInclusive<usize>> for Vec<T>`
- `impl<T> IndexMut<RangeToInclusive<usize>> for Vec<T>`
- `impl<A> IndexMut<usize> for VecDeque<A>`

# Help

## Keyboard Shortcuts

?
  Show this help dialog
S
  Focus the search field
⇤
  Move up in search results
⇥
  Move down in search results
⏎
  Go to active search result
+
  Collapse/expand all sections

## Search Tricks

Prefix searches with a type followed by a colon (e.g. `fn:`) to restrict the search to a given type.

Accepted types are: `fn`, `mod`, `struct`, `enum`, `trait`, `type`, `macro`, and `const`.

Search functions by type signature (e.g. `vec -> usize` or `* -> vec`)