質問するログイン新規登録

Q&A

解決済

1回答

1962閲覧

【Rust】関数内で所有権が移動されたオブジェクトをcloneメソッドを使わずに外部に取り出したい

akira_kano1101

総合スコア25

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2022/03/24 10:22

編集2022/03/24 11:40

0

0

こんにちは。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でディープコピーを行いたくない場合、どう実装を書けばよいかわかりません。

ご存じの方もしいらっしゃれば、恐縮ですが教えていただけないでしょうか?

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答の取得に失敗しました

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問