こんにちは。Rustでソフトウェアの開発を行なっています。
Rustで関数の内側で作られたオブジェクトは外側に持ち出せないのかどうか簡単なケースで検証を行なっています。
問題のソースコード
rust
1use std::sync::{Arc, Mutex}; 2 3 #[derive(Clone)] 4 struct Foo { 5 x: i32, 6 } 7 8 fn handle_with_clone(from: Arc<Mutex<Foo>>) -> Foo { 9 (*from.lock().unwrap()).clone() } 10 fn handle_without_clone(from: Arc<Mutex<Foo>>) -> Foo { 11 *from.lock().unwrap() // コンパイルエラー 12 } 13 14 fn main() { 15 let x = Arc::new(Mutex::new(Foo { x: 1 })); 16 17 let y = handle_with_clone(Arc::clone(&x)); 18 let z = handle_without_clone(Arc::clone(&x)); 19 }
エラーメッセージ抜粋
error[E0507]: cannot move out of dereference of `MutexGuard<'_, Foo>` --> src/main.rs:12:5 | 12 | *from.lock().unwrap() | ^^^^^^^^^^^^^^^^^^^^^ move occurs because value has type `Foo`, which does not implement the `Copy` trait
関数内でclone()メソッドを使うと値が取り出せるのですが、cloneでディープコピーを行いたくない場合、どう実装を書けばよいかわかりません。
ご存じの方もしいらっしゃれば、恐縮ですが教えていただけないでしょうか?
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/29 09:46