1. ホーム
  2. rust

[解決済み] クロージャがFn、FnMut、FnOnceを実装するのはどんなとき?

2022-04-24 03:19:18

質問

とは何ですか? 特定条件 を実装するためのクロージャです。 Fn , FnMutFnOnce の特徴を教えてください。

ということです。

  • クロージャはいつ ではなく を実装しています。 FnOnce トライット?
  • クロージャはいつ ではなく を実装しています。 FnMut トライット?
  • クロージャはいつ ではなく を実装しています。 Fn トライット?

例えば、クロージャの状態を本体で変異させると、コンパイラは Fn を追加しました。

解決方法は?

各特性は、クロージャ/関数に関するより多くの制限的なプロパティを表し、そのシグネチャは call_... メソッド、特に self :

  • FnOnce ( self は一度だけ呼び出すことができる関数
  • FnMut ( &mut self ) があれば呼び出すことができる関数です。 &mut 環境にアクセスできる
  • Fn ( &self を持つだけなら呼び出すことができる関数です。 & 環境にアクセスできる

クロージャ |...| ... は、できる限り多くのものを自動的に実装します。

  • すべてのクロージャは FnOnce 一度も呼び出されないクロージャは、その名前に値しない。もし、クロージャが FnOnce 一度だけ呼び出すことができます。
  • キャプチャから移動しないクロージャは、以下の機能を実装しています。 FnMut 関数オブジェクトに非エイリアスなアクセスがある場合)複数回呼び出すことができます。
  • キャプチャへのユニーク/ミュータブルアクセスを必要としないクロージャは、以下の機能を実装しています。 Fn そのため、基本的にどこでも呼び出すことができます。

これらの制限は、直接的に self で説明したように、クロージャを構造体に変換しています。 Rustでクロージャを見つける .

クロージャについては クロージャ。環境を捕捉することができる匿名関数 Rust プログラミング言語 .