web-dev-qa-db-ja.com

「Box <Fn()+ Send + 'static>」は錆びているとはどういう意味ですか?

さびでBox<Fn() + Send + 'static>はどういう意味ですか?

高度な型の章を読んでいるときに、この構文に出くわしました。 Sendは特性ですが、型のパラメーター化において、特性(この場合は_+_)の寿命を_'static_とはどういう意味ですか?また、Fn()とは何ですか?

12
soupybionics

一つずつ分解していきましょう。

ボックス

_Box<T>_は、ヒープに割り当てられたTへのポインターです。トレイトオブジェクトはポインタの背後にのみ存在できるため、ここで使用します。

トレイトオブジェクト

Box<Fn() + Send + 'static>では、Fn() + Send + 'static特性オブジェクト 型です。将来的には、混乱を避けるために Box<dyn (Fn() + Send + 'static)> と記述されます。

dynの中には、元のタイプに対する制限があります。 _Box<T>_は、Box<Fn() + Send + 'static>の場合にのみT: Fn() + Send + 'staticに強制変換できます。したがって、元のタイプはわかりませんが、Fn()およびSendであり、は_'static_ lifetime

Fn()

これは、CloneまたはDefaultと同じように特性です。ただし、特殊なシンタックスシュガーを使用します。

  • Fn(A1, ..., An)は、Fn<(A1, ..., An), Output=()>のシンタックスシュガーです。
  • Fn(A1, ..., An) -> Rは、Fn<(A1, ..., An), Output=R>のシンタックスシュガーです。
  • このシンタックスシュガーは、次の特性にも適用されます。 FnFnMutFnOnce =、および FnBox

では、Fnはどういう意味ですか? T: Fn(A1, ..., An) -> Rは、_x: T_が引数_A1, ..., An_および戻り値の型Rを持つ呼び出し可能なオブジェクトであることを意味します。例には、関数ポインタとクロージャが含まれます。

送信

Send は、このタイプの値をスレッド間で送信できることを意味します。これは 自動トレイト であるため、 2番目の境界として指定できますdynタイプ(トレイトオブジェクトタイプ)です。

_'static_バウンド

実際、dynタイプ(トレイトオブジェクトタイプ)には、1つのライフタイムバウンドが必要です。省略した場合に推測されます。推論規則は RFC 0192 および RFC 1156 で説明されています。基本的には次のとおりです。

  1. 明示的に指定されている場合は、そのライフタイムを使用します。
  2. それ以外の場合は、内部特性から推測されます。たとえば、_Box<Any>_は_Box<Any + 'static>_です。これは、 _Any: 'static_ であるためです。
  3. 特性に適切な寿命がない場合は、外側のタイプから推測されます。たとえば、&'a Fn()&'a (Fn() + 'a)です。
  4. それでも失敗した場合は、_'static_(関数シグネチャの場合)または匿名の有効期間(関数本体の場合)にフォールバックします。

結論

f: Box<Fn() + Send + 'static>は、クロージャ(引数なしまたは戻り値なし)などの呼び出し可能な値(元の型が不明で動的に変更される)への所有ポインタであり、スレッド間で送信でき、プログラム自体。

20
Masaki Hara