92819


`Rc`と`RefCell`を使って、以下のように動作確認をしていました。

[code]

    use std::borrow::BorrowMut;
    use std::cell::RefCell;
    use std::rc::Rc;
    
    #[derive(Debug)]
    struct Test {
        num: i32,
    }
    
    fn main() {
        let a = Rc::new(RefCell::new(Test { num: 100 }));
        let a1 = a.clone();
        a.borrow_mut().num = 100;
        a1.borrow_mut().num = 100;
        println!("a: {:?}", a);
        println!("a1: {:?}", a1);
    }
    
[/code]

すると、100を代入している部分で以下のエラーが発生しました。

[code]

    error[E0609]: no field `num` on type `&mut Rc<RefCell<Test>>`
      --> src/main.rs:13:20
       |
    13 |     a.borrow_mut().num = 100;
       |                    ^^^ unknown field
    
[/code]

以下の記事を参考に動作を見ていたのですが、このようなエラーは出てなく疑問に思っています。

[Rust の Cell, RefCell を整理する](https://zenn.dev/tan_y/articles/307533011ac2c0)

こちらどのように修正すれば`Test`構造体の内容を変更できるのでしょうか？

よろしくお願いいたします。


CC BY-SA 4.0
2022-12-16T09:36:01.393
92818
2022-12-16T12:02:33.190
2022-12-16T12:02:33.190
3060
24870
question
rust
Rc<RefCell<T>>のTを編集できない

[code]

    error[E0609]: no field `num` on type `&mut Rc<RefCell<Test>>`
    
[/code]

エラーメッセージを見ると、[RefCell::borrow_mut](https://doc.rust-
lang.org/std/cell/struct.RefCell.html#method.borrow_mut) を呼んでから .num
にアクセスしたいところで、意図と異なり [Rc の BorrowMut::borrow_mut](https://doc.rust-
lang.org/stable/std/borrow/trait.BorrowMut.html#tymethod.borrow_mut)
が呼ばれてしまっているようです。  
BorrowMut トレイトを use しないでおけば、 Rc に borrow_mut メソッドがないため勝手に参照外し (deref) が発生し、内側の
RefCell の borrow_mut が呼ばれるようになります。

[https://play.rust-
lang.org/?version=stable&mode=debug&edition=2021&gist=38e0fb2bb26a7ccf83733f8658300691](https://play.rust-
lang.org/?version=stable&mode=debug&edition=2021&gist=38e0fb2bb26a7ccf83733f8658300691)


CC BY-SA 4.0
2022-12-16T10:17:45.857
92819
2022-12-16T10:17:45.857
32355
92818
answer