即使当我实施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
获得可变引用?是否可以?
你快到了。改变这个:
let mut b = a[1];
b = 10;
to this:
let b = &mut a[1];
*b = 10;
索引语法返回值本身,而不是对其的引用 https://stackoverflow.com/q/27879161/155423。你的代码提取了一个i32
来自向量并修改变量 - 当然,它不会影响向量本身。为了通过索引获取引用,需要显式地编写。
这是很自然的:当您使用索引来访问切片或数组的元素时,您获得的是元素的值,而不是对它们的引用,并且为了获得引用,您需要显式地编写它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)