5

私が正しく理解した場合、Rust でaを介して変更可能な借用を作成することはできません。 orを使用する必要があります。しかし、とにかく私はそれらを使用する方法を理解できません。たとえば、次の簡単な例を考えてみましょう。std::rc::RcCellRefCell

use std::cell::RefCell;

struct X (i32);

impl X {
    fn foo(&mut self) {
        self.0 = 0;
    }
}

fn main () {
    let x = X(5);
    let rcx = RefCell::new(&x);

    let mut mutx: std::cell::RefMut<&X> = rcx.borrow_mut();
    (*mutx).foo();
}

次のエラーが表示されます。

16:5: 16:9 error: cannot borrow immutable local variable `mutx` as mutable
16     mutx.foo();

しかし、行から参照を削除した場合 (および のタイプを更新した場合mutx):

let rcx = RefCell::new(x);

すべて順調。RefMut::deref_mut() -> &mut Tしかし、 16 行目で呼び出された deference&&mut Tは最初のケースでは返され、2 番目のケースでは返されるはずなので、その理由がわかりません&mut T。しかし、コンパイラは必要に応じて多くを適用する必要があるため ( deref 強制*がどのように機能するかがわかれば)、 と の間に違いはないはずです。RefMut<X>::deref_mut()RefMut<&X>::deref_mut()

編集mut:リンクされた例が正しく書かれているので、間違って15行目に書くのを忘れました。だから今はlet mut mutx...

4

1 に答える 1

4

この問題は、不変の参照をRefCell. なぜあなたがそのようなことを望んでいるのか、私にはわかりません。RefCell通常のパターンは、参照だけでなく、値全体を に入れることです。

fn main () {
    let rcx = RefCell::new(X(5));

    let mut mutx = rcx.borrow_mut();
    mutx.foo();
}

元の質問からの問題

2 つの複合エラーがあります。エラー メッセージ全体を確認してみましょう。

<anon>:16:5: 16:12 error: cannot borrow immutable borrowed content as mutable
<anon>:16     (*mutx).foo();
              ^~~~~~~
<anon>:16:7: 16:11 error: cannot borrow immutable local variable `mutx` as mutable
<anon>:16     (*mutx).foo();
                ^~~~

2 番目のエラーに注意してください — 「不変のローカル変数を借用できませんmutx」。mutxこれは、可変変数を宣言する必要があるためです。

let mut mutx: std::cell::RefMut<&X> = rcx.borrow_mut();

mutxに参加できるようになりDerefMutます。

于 2015-09-15T17:10:48.453 に答える