使用`index_mut`获取可变引用

时间:2015-03-22 06:59:59

标签: rust traits

我正在尝试学习Rust,我遇到了下一个问题:即使我为我的struct实现了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获取可变引用?有可能吗?

使用rustc 1.0.0-dev (built 2015-03-21)中的rust-nightly

1 个答案:

答案 0 :(得分:2)

你几乎就在那里。改变这个:

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

到此:

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

索引语法返回值本身,而不是对它的引用。您的代码只从向量中提取一个i32并修改变量 - 当然,它不会影响向量本身。为了通过索引获取引用,您需要显式地编写它。支撑是必要的,以防止可变借用干扰后来的矢量访问。

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