前提・実現したいこと
Box<T>で書いたコードをRc<RefCell<T>>に書き直しています。
「.borrow_mut().」をメソッドの呼び出し側に追加すると修正箇所が増えるので、
メソッドの中に記述したいと考え、下記のようなコードを試しに作りました。
コメントアウトした箇所のように書きたかったのですが、
このままコメントを外して実行するとコンパイルエラーになります(E0599)。
エラーを回避できるメソッドの書き方はあるでしょうか。
該当のソースコード
Rust
1use std::rc::Rc; 2use std::cell::RefCell; 3 4#[derive(Default,Debug)] 5struct X { x:usize, } 6impl X { 7 fn set_x_1(& mut self,x:usize) { 8 self.x=x; 9 } 10// fn set_x_2(& self,x:usize) { 11// self.borrow_mut().x=x; 12// } 13} 14 15fn main() { 16 let mut b = Box::new(X::default()); 17 let r = Rc::new(RefCell::new(X::default())); 18 19 println!("b1: {:?}",&b); 20 println!("r1: {:?}",&r); 21 22 b.set_x_1(100); 23 r.borrow_mut().set_x_1(200); //←こうではなく、 24// r.set_x_2(200); //←こう書きたかった 25 26 println!("b2: {:?}",&b); 27 println!("r2: {:?}",&r); 28}
発生している問題・エラーメッセージ
上記コードからコメントアウトを消してcargo runすると、コンパイルエラーが2つ発生します。
どちらも、メソッドがcurrent scopeで見つからないというエラーです。
helpにある「use std::borrow::BorrowMut;」を追加しても効果がないようでした。
構造体が、RcとRefCellによって二重にくるまれているので、そもそもimplの使い方が間違っているのでしょうか。
Compiling test_rcref v0.1.0 (/mnt/c/wsl_share/rust/test_rcref) error[E0599]: no method named `borrow_mut` found for reference `&X` in the current scope --> src/main.rs:11:14 | 11 | self.borrow_mut().x=x; | ^^^^^^^^^^ method not found in `&X` | = help: items from traits can only be used if the trait is in scope help: the following trait is implemented but not in scope; perhaps add a `use` for it: | 1 | use std::borrow::BorrowMut; | error[E0599]: no method named `set_x_2` found for struct `std::rc::Rc<std::cell::RefCell<X>>` in the current scope --> src/main.rs:24:7 | 24 | r.set_x_2(200); //←こう書きたかった | ^^^^^^^ method not found in `std::rc::Rc<std::cell::RefCell<X>>` error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0599`. error: could not compile `test_rcref`. To learn more, run the command again with --verbose.
補足情報(FW/ツールのバージョンなど)
OS: Windows10 + WSL1 + Ubuntu
Rust:1.42.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/21 12:22