質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
86.12%
Rust

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

解決済

クロージャ間で変数を共有できない場合にCellを使うのは適当か

trrk
trrk

総合スコア20

Rust

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

1回答

0リアクション

0クリップ

317閲覧

投稿2022/10/02 04:23

前提

あるプログラムを作りました。
エラーが出てコンパイルできませんでしたが、Cellを使うとコンパイルできました。
動作はgetもsetも常に成功するようで問題なさそうです。

コンパイルはできましたが、この場面でCell、内部可変性を使うのが適当なのかわかっていません。
適当でしょうか?
適当ではない場合、Cellを使わないでよい方法はありますか?

実現したいこと

こういったコード

  • 入力がイテレータ(impl Iterator)
  • 入力イテレータが出す値を基本的には順番に別の関数へ渡し、その値の処理結果が得られるイテレータを得る
    • このイテレータが出す値を最終的にVecにまとめる
    • このイテレータが出す値によっては、入力イテレータが出す残りの要素を、特定の条件を満たすまで無視する

発生している問題・エラーメッセージ

Cellを使わないときのコンパイルエラー

error: captured variable cannot escape `FnMut` closure body --> src/main.rs:70:9 | 56 | let mut next_start = 0; // 無視する条件にかかわる変数 | -------------- variable defined here 57 | 58 | let main_result = iter::from_fn(|| { | - inferred to be a `FnMut` closure 59 | let start = std::mem::take(&mut next_start); | ---------- variable captured here ... 70 | Some(process_line(input_line).inspect(|(end, _)| { next_start = *end; })) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ returns a reference to a captured variable which escapes the closure body | = note: `FnMut` closures only have access to their captured variables while they are executing... = note: ...therefore, they cannot allow references to captured variables to escape

該当のソースコード

元のコードより簡略化したものです。
Cellを使うメイン処理(コメントアウト)と使わないメイン処理の両方を書いてあります。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=92ff444fb49504859dd6d767c9a575b9

試したこと

コンパイルが通るように色々試す

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Rust

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