0

これを機能させるために何時間も無駄な時間を費やしてきましたが、私の唯一の手段はコードを要約して皆さんに助けを求めることです。

状況は、次のコードで の 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います — ただし、偶然ではないと言えば十分です

indexPPSメソッドやトレイトに関連付けられた型の有効期間の注釈を少しいじってみましたが、これまでのところ、それを行うことでさまざまなエラーが発生するだけでした

4

1 に答える 1

2

不変参照で機能する理由は、それらが暗黙的にコピーできるためです。を返そうとすることに切り替えると、&mutその参照を持つ場所が 2 つあります - Vec と関数の呼び出し元です。これによりエイリアスが導入され、変更可能なエイリアスは Rust では許可されません。

Index実装を無視して、これを試すこともできます:

fn main() {
    let mut f = Foo::new(1,2,3);
    f.add_t_ref(1);
    f.add_t_ref(2);
}

あなたは得るでしょう:

error: cannot borrow `f` as mutable more than once at a time

上記はすべて真実ですが、特定のエラー メッセージが表示される理由を説明するものではありません。

于 2015-02-16T23:50:24.453 に答える