さびでBox<Fn() + Send + 'static>
はどういう意味ですか?
高度な型の章を読んでいるときに、この構文に出くわしました。 Send
は特性ですが、型のパラメーター化において、特性(この場合は_+
_)の寿命を_'static
_とはどういう意味ですか?また、Fn()
とは何ですか?
一つずつ分解していきましょう。
_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>
のシンタックスシュガーです。Fn
、 FnMut
、 FnOnce
=、および FnBox
。では、Fn
はどういう意味ですか? T: Fn(A1, ..., An) -> R
は、_x: T
_が引数_A1, ..., An
_および戻り値の型R
を持つ呼び出し可能なオブジェクトであることを意味します。例には、関数ポインタとクロージャが含まれます。
Send
は、このタイプの値をスレッド間で送信できることを意味します。これは 自動トレイト であるため、 2番目の境界として指定できますdyn
タイプ(トレイトオブジェクトタイプ)です。
'static
_バウンド実際、dyn
タイプ(トレイトオブジェクトタイプ)には、1つのライフタイムバウンドが必要です。省略した場合に推測されます。推論規則は RFC 0192 および RFC 1156 で説明されています。基本的には次のとおりです。
Box<Any>
_は_Box<Any + 'static>
_です。これは、 _Any: 'static
_ であるためです。&'a Fn()
は&'a (Fn() + 'a)
です。'static
_(関数シグネチャの場合)または匿名の有効期間(関数本体の場合)にフォールバックします。f: Box<Fn() + Send + 'static>
は、クロージャ(引数なしまたは戻り値なし)などの呼び出し可能な値(元の型が不明で動的に変更される)への所有ポインタであり、スレッド間で送信でき、プログラム自体。