我試圖在一個結構中包裝切片,以便我可以實例化結構可變或不可變。這裏有一個小例子:如何讓結構字段具有與父結構相同的可變性?
use std::ops::{ Index, IndexMut };
struct Test<'a, T: 'a> {
inner: &'a[T]
}
impl<'a, T: 'a> Test<'a, T> {
fn new (inner: &'a[T]) -> Self { Test { inner: inner } }
}
impl<'a, T> Index<usize> for Test<'a, T> {
type Output = T;
fn index (&self, i: usize) -> &T { &self.inner[i] }
}
impl<'a, T> IndexMut<usize> for Test<'a, T> {
fn index_mut (&mut self, i: usize) -> &mut T { &mut self.inner[i] }
}
fn main() {
let store = [0; 3];
let test = Test::new (&store);
println!("{}", test[1]);
let mut mut_store = [0; 3];
let mut mut_test = Test::new (&mut mut_store);
mut_test[1] = 42;
println!("{}", mut_test[1]);
}
這並不編譯:「不能借一成不變的索引內容self.inner[..]
爲可變」。
我能得到它通過改變inner
的定義是&'a mut[T]
類型的編譯,但隨後inner
是,即使我並不需要它(在上面的例子中可變的,我必須然後聲明store
爲可變即使test
是不可變的)。
有沒有辦法讓inner
的可變性跟在Test
實例的可變性之後?