構造体のスライスをラップして、構造体を可変または不変にインスタンス化できるようにしようとしています。ここでは、最小限の例です:親構造体と同じ変更可能な構造体フィールドを持つ方法はありますか?
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[..]
を借りることができません」。
私はそれがタイプ&'a mut[T]
であることがinner
の定義を変更してコンパイルするために取得するが、その後inner
ことができ、私は(上記の例では、私はその後、可変としてstore
を宣言しなければならないことを、それを必要としない場合でも変更可能ですtest
は不変であるにもかかわらず)。
inner
の可変性がTest
インスタンスの可変性に従うようにする方法はありますか?同様の質問で述べて