Я пытаюсь обернуть срез в структуре, чтобы я мог инстанцировать структуру изменчиво или неизменно. Вот минимальный пример:Как создать поле структуры с той же изменчивостью, что и родительская структура?
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
?