Box<Fn() + Send + 'static>
は何を意味するのですか?"Box <Fn()+ Send + 'static>"とは何を意味しますか?
高度なタイプの章を読んでいるときに、この構文を見つけました。 Send
は形質ですが、+
という特性に寿命(この場合は'static
)の型のパラメータ化とはどういう意味ですか? Fn()
とは何ですか?
Box<Fn() + Send + 'static>
は何を意味するのですか?"Box <Fn()+ Send + 'static>"とは何を意味しますか?
高度なタイプの章を読んでいるときに、この構文を見つけました。 Send
は形質ですが、+
という特性に寿命(この場合は'static
)の型のパラメータ化とはどういう意味ですか? Fn()
とは何ですか?
それを1つ1つ分解しましょう。
Box<T>
ヒープ割り当てT
へのポインタです。ここでは、特性オブジェクトはポインタの後ろにしか存在しないため、ここで使用します。
Fn() + Send + 'static
がtrait object型であり、Box<Fn() + Send + 'static>
でオブジェクト。将来は混乱を避けるためにwritten Box<dyn (Fn() + Send + 'static)>
になります。
内側dyn
は元のタイプに制限があります。 Box<T>
は、T: Fn() + Send + 'static
の場合にのみ、Box<Fn() + Send + 'static>
に強制できます。したがって、元のタイプはわからないが、Fn()
とSend
とは'static
の寿命がであるとみなすことができます。
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
を送るには、このタイプの値は、スレッド間で送ることができることを意味します。これはauto traitなので、can be specified as the second boundsのdyn
タイプ(特性オブジェクトタイプ)です。実際に
をバインド
'static
、dyn
種類(形質オブジェクトタイプ)は正確に一つの寿命がを拘束されている必要があります。省略された場合、それは推測されます。推論規則は、RFC 0192とRFC 1156に記述されています。基本的に次のようになります。Box<Any>
は、Any: 'static
であるため、Box<Any + 'static>
です。&'a Fn()
は&'a (Fn() + 'a)
です。'static
(機能署名用)または匿名有効期間(機能本体用)に戻ります。f: Box<Fn() + Send + 'static>
は、スレッド間で送信することができる(引数またはノーリターン値なしで)閉鎖、など(変更動的不明とオリジナルタイプを持つ)呼び出し可能な値に所有ポインタで結論とプログラムそのものに限ります。
詳しい説明はMasakiありがとうございました! 1つのトピック外の質問: 'Box <&i32>'は、 'heap'にポインタ/参照を割り当て、'借用したコンテンツ(i32) '(それが指しているデータ)をスタックに置くことができるのでしょうか? 'b 'は私に'&i32'を与え、 '** b'は100を与えます(' let m = 100; b:Box= Box :: new(println! 'ここで' autorefs' – soupybionics