これを機能させるために何時間も無駄な時間を費やしてきましたが、私の唯一の手段はコードを要約して皆さんに助けを求めることです。
状況は、次のコードで の 2 つのインスタンスのコメントを外すと、mut
コンパイルされなくなります (私にとって意味のある理由ではありません)。
use std::cell::RefCell;
use std::ops::Index;
struct Foo<'a, T: 'a> {
t_array: [T; 3],
t_refs: RefCell<Vec<&'a /* mut */ T>>, //' // 1
}
impl<'a, T> Foo<'a, T> {
fn new(t1: T, t2: T, t3: T) -> Foo<'a, T> { //'
Foo {
t_array: [t1, t2, t3],
t_refs: RefCell::new(Vec::with_capacity(3))
}
}
fn add_t_ref(&'a mut self, at_index: usize) { //'
let t_ref = & /* mut */ self.t_array[at_index]; // 2
let mut t_refs = self.t_refs.borrow_mut();
t_refs.push(t_ref);
}
}
impl<'a, T> Index<usize> for Foo<'a, T> {
type Output = T;
#[inline]
fn index(&self, index: &usize) -> &T {
let t_refs = self.t_refs.borrow();
t_refs[*index]
}
}
mut
代わりにref を格納するときに発生するエラーVec
は次のとおりです。
blah3_mut.rs:26:9: 26:15 error: `t_refs` does not live long enough
blah3_mut.rs:26 t_refs[*index]
^~~~~~
blah3_mut.rs:24:42: 27:6 note: reference must be valid for the anonymous lifetime #1 defined on the block at 24:41...
blah3_mut.rs:25:42: 27:6 note: ...but borrowed value is only valid for the block suffix following statement 0 at 25:41
誰かがなぜこれが起こっているのか説明できれば幸いです。RefCell
直感的には、の借用が範囲外になることは問題ではないように思われます。Vec
参照が指すデータを (したがってもRefCell
) 所有していないのに、なぜコンパイラはそれらの参照の有効期間を気にするのでしょうか?
PS 単純化されたコードの抜粋では、変更可能な参照を a に格納しているVec
理由や、a を使用している理由が明らかにならないことはわかってRefCell
います — ただし、偶然ではないと言えば十分です
index
PPSメソッドやトレイトに関連付けられた型の有効期間の注釈を少しいじってみましたが、これまでのところ、それを行うことでさまざまなエラーが発生するだけでした