Skip to main content

IndexMut

Trait IndexMut 

1.6.0 (const: unstable) · Source
pub trait IndexMut<Idx>: Index<Idx>
where Idx: ?Sized,
{ // Required method fn index_mut(&mut self, index: Idx) -> &mut Self::Output; }
Expand description

Used for indexing operations (container[index]) in mutable contexts.

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.

§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(&self, index: Side) -> &Self::Output {
        println!("Accessing {index:?}-side of balance immutably");
        match index {
            Side::Left => &self.left,
            Side::Right => &self.right,
        }
    }
}

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

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);

Required Methods§

1.0.0 (const: unstable) · Source

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

Performs the mutable indexing (container[index]) operation.

§Panics

May panic if the index is out of bounds.

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§

Source§

impl IndexMut<Range<usize>> for BStr

Source§

impl IndexMut<Range<usize>> for ByteString

Source§

impl IndexMut<RangeFrom<usize>> for BStr

Source§

impl IndexMut<RangeFrom<usize>> for ByteString

Source§

impl IndexMut<RangeFull> for BStr

Source§

impl IndexMut<RangeFull> for ByteString

1.44.0 · Source§

impl IndexMut<RangeFull> for OsString

Source§

impl IndexMut<RangeInclusive<usize>> for BStr

Source§

impl IndexMut<RangeInclusive<usize>> for ByteString

Source§

impl IndexMut<RangeTo<usize>> for BStr

Source§

impl IndexMut<RangeTo<usize>> for ByteString

Source§

impl IndexMut<RangeToInclusive<usize>> for BStr

Source§

impl IndexMut<RangeToInclusive<usize>> for ByteString

Source§

impl IndexMut<usize> for BStr

Source§

impl IndexMut<usize> for ByteString

§

impl<'s, T, I> IndexMut<I> for SliceVec<'s, T>
where I: SliceIndex<[T]>,

§

impl<A, I> IndexMut<I> for ArrayVec<A>
where A: Array, I: SliceIndex<[<A as Array>::Item]>,

§

impl<A, I> IndexMut<I> for SmallVec<A>
where A: Array, I: SliceIndex<[<A as Array>::Item]>,

§

impl<A, I> IndexMut<I> for TinyVec<A>
where A: Array, I: SliceIndex<[<A as Array>::Item]>,

Source§

impl<I, T, const N: usize> IndexMut<I> for Simd<T, N>
where T: SimdElement, I: SliceIndex<[T]>,

Source§

impl<I> IndexMut<I> for ByteStr
where I: SliceIndex<ByteStr>,

1.0.0 · Source§

impl<I> IndexMut<I> for String
where I: SliceIndex<str>,

Source§

impl<I> IndexMut<I> for Value
where I: Index,

1.0.0 (const: unstable) · Source§

impl<I> IndexMut<I> for str
where I: SliceIndex<str>,

Source§

impl<K, V, Q, S> IndexMut<&Q> for indexmap::map::IndexMap<K, V, S>
where Q: Hash + Equivalent<K> + ?Sized, K: Hash + Eq, S: BuildHasher,

Access IndexMap values corresponding to a key.

Mutable indexing allows changing / updating values of key-value pairs that are already present.

You can not insert new pairs with index syntax, use .insert().

§Examples

use indexmap::IndexMap;

let mut map = IndexMap::new();
for word in "Lorem ipsum dolor sit amet".split_whitespace() {
    map.insert(word.to_lowercase(), word.to_string());
}
let lorem = &mut map["lorem"];
assert_eq!(lorem, "Lorem");
lorem.retain(char::is_lowercase);
assert_eq!(map["lorem"], "orem");
use indexmap::IndexMap;

let mut map = IndexMap::new();
map.insert("foo", 1);
map["bar"] = 1; // panics!
§

impl<K, V, Q, S> IndexMut<&Q> for IndexMap<K, V, S>
where Q: Hash + Equivalent<K> + ?Sized, S: BuildHasher,

Access [IndexMap] values corresponding to a key.

Mutable indexing allows changing / updating values of key-value pairs that are already present.

You can not insert new pairs with index syntax, use .insert().

§Examples

use indexmap::IndexMap;

let mut map = IndexMap::new();
for word in "Lorem ipsum dolor sit amet".split_whitespace() {
    map.insert(word.to_lowercase(), word.to_string());
}
let lorem = &mut map["lorem"];
assert_eq!(lorem, "Lorem");
lorem.retain(char::is_lowercase);
assert_eq!(map["lorem"], "orem");
use indexmap::IndexMap;

let mut map = IndexMap::new();
map.insert("foo", 1);
map["bar"] = 1; // panics!
§

impl<K, V, S> IndexMut<(Bound<usize>, Bound<usize>)> for IndexMap<K, V, S>

§

impl<K, V, S> IndexMut<Range<usize>> for IndexMap<K, V, S>

§

impl<K, V, S> IndexMut<RangeFrom<usize>> for IndexMap<K, V, S>

§

impl<K, V, S> IndexMut<RangeFull> for IndexMap<K, V, S>

§

impl<K, V, S> IndexMut<RangeInclusive<usize>> for IndexMap<K, V, S>

§

impl<K, V, S> IndexMut<RangeTo<usize>> for IndexMap<K, V, S>

§

impl<K, V, S> IndexMut<RangeToInclusive<usize>> for IndexMap<K, V, S>

§

impl<K, V, S> IndexMut<usize> for IndexMap<K, V, S>

Access [IndexMap] values at indexed positions.

Mutable indexing allows changing / updating indexed values that are already present.

You can not insert new values with index syntax – use [.insert()][IndexMap::insert].

§Examples

use indexmap::IndexMap;

let mut map = IndexMap::new();
for word in "Lorem ipsum dolor sit amet".split_whitespace() {
    map.insert(word.to_lowercase(), word.to_string());
}
let lorem = &mut map[0];
assert_eq!(lorem, "Lorem");
lorem.retain(char::is_lowercase);
assert_eq!(map["lorem"], "orem");
use indexmap::IndexMap;

let mut map = IndexMap::new();
map.insert("foo", 1);
map[10] = 1; // panics!
Source§

impl<K, V, S> IndexMut<usize> for indexmap::map::IndexMap<K, V, S>

Access IndexMap values at indexed positions.

Mutable indexing allows changing / updating indexed values that are already present.

You can not insert new values with index syntax, use .insert().

§Examples

use indexmap::IndexMap;

let mut map = IndexMap::new();
for word in "Lorem ipsum dolor sit amet".split_whitespace() {
    map.insert(word.to_lowercase(), word.to_string());
}
let lorem = &mut map[0];
assert_eq!(lorem, "Lorem");
lorem.retain(char::is_lowercase);
assert_eq!(map["lorem"], "orem");
use indexmap::IndexMap;

let mut map = IndexMap::new();
map.insert("foo", 1);
map[10] = 1; // panics!
§

impl<K, V> IndexMut<(Bound<usize>, Bound<usize>)> for Slice<K, V>

§

impl<K, V> IndexMut<Range<usize>> for Slice<K, V>

§

impl<K, V> IndexMut<RangeFrom<usize>> for Slice<K, V>

§

impl<K, V> IndexMut<RangeFull> for Slice<K, V>

§

impl<K, V> IndexMut<RangeInclusive<usize>> for Slice<K, V>

§

impl<K, V> IndexMut<RangeTo<usize>> for Slice<K, V>

§

impl<K, V> IndexMut<RangeToInclusive<usize>> for Slice<K, V>

§

impl<K, V> IndexMut<usize> for Slice<K, V>

Source§

impl<Q> IndexMut<&Q> for Map<String, Value>
where String: Borrow<Q>, Q: Ord + Eq + Hash + ?Sized,

Mutably access an element of this map. Panics if the given key is not present in the map.

map["key"] = json!("value");
1.0.0 · Source§

impl<T, A> IndexMut<usize> for VecDeque<T, A>
where A: Allocator,

1.0.0 (const: unstable) · Source§

impl<T, I, A> IndexMut<I> for Vec<T, A>
where I: SliceIndex<[T]>, A: Allocator,

1.50.0 (const: unstable) · Source§

impl<T, I, const N: usize> IndexMut<I> for [T; N]
where [T]: IndexMut<I>,

1.0.0 (const: unstable) · Source§

impl<T, I> IndexMut<I> for [T]
where I: SliceIndex<[T]>,

§

impl<T> IndexMut<usize> for Slab<T>