当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust IndexMut用法及代码示例


本文简要介绍rust语言中 Trait core::ops::IndexMut 的用法。

用法

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

用于可变上下文中的索引操作 (container[index])。

container[index] 实际上是 *container.index_mut(index) 的语法糖,但仅在用作可变值时。如果请求不可变值,则使用 Index 特征。这允许诸如 v[index] = value 之类的好东西。

例子

Balance 结构的一个非常简单的实现,它有两个边,每个边都可以被可变和不可变地索引。

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 {:?}-side of balance immutably", index);
        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 {:?}-side of balance mutably", index);
        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);

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait core::ops::IndexMut。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。