如何使用“ index_mut”获取可变引用?

洛丁

即使当我IndexMut为我的结构实现时,也无法获得对结构内部向量元素的可变引用。

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

struct Test<T> {
    data: Vec<T>,
}

impl<T> Index<usize> for Test<T> {
    type Output = T;
    fn index<'a>(&'a self, idx: usize) -> &'a T {
        return &self.data[idx];
    }
}

impl<T> IndexMut<usize> for Test<T> {
    fn index_mut<'a>(&'a mut self, idx: usize) -> &'a mut T {
        // even here I cannot get mutable reference to self.data[idx]
        return self.data.index_mut(idx);
    }
}

fn main() {
    let mut a: Test<i32> = Test { data: Vec::new() };
    a.data.push(1);
    a.data.push(2);
    a.data.push(3);
    let mut b = a[1];
    b = 10;

    // will print `[1, 2, 3]` instead of [1, 10, 3]
    println!("[{}, {}, {}]", a.data[0], a.data[1], a.data[2]);
}

如何index_mut获得可变的参考?可能吗?

弗拉基米尔·马特维耶夫(Vladimir Matveev)

您快到了。更改此:

let mut b = a[1];
b = 10;

对此:

let b = &mut a[1];
*b = 10;

索引语法返回值本身,而不是对其的引用您的代码i32从向量中提取一个并修改变量-自然,它不会影响向量本身。为了通过索引获得引用,您需要显式地编写它。

这是很自然的:使用索引访问切片或数组的元素时,您将获得元素的值,而不是对它们的引用,并且为了获得引用,您需要显式地编写它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章