2017-12-29 50 views
1

Box<Fn() + Send + 'static>は何を意味するのですか?"Box <Fn()+ Send + 'static>"とは何を意味しますか?

高度なタイプの章を読んでいるときに、この構文を見つけました。 Sendは形質ですが、+という特性に寿命(この場合は'static)の型のパラメータ化とはどういう意味ですか? Fn()とは何ですか?

答えて

4

それを1つ1つ分解しましょう。

ボックス

Box<T>ヒープ割り当てTへのポインタです。ここでは、特性オブジェクトはポインタの後ろにしか存在しないため、ここで使用します。

形質はFn() + Send + 'statictrait 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 boundsdynタイプ(特性オブジェクトタイプ)です。実際に

をバインド

'staticdyn種類(形質オブジェクトタイプ)は正確に一つの寿命がを拘束されている必要があります。省略された場合、それは推測されます。推論規則は、RFC 0192RFC 1156に記述されています。基本的に次のようになります。

  1. 明示的に指定されている場合は、その有効期間を使用してください。
  2. それ以外の場合は、内側の特性から推測されます。例えば、Box<Any>は、Any: 'staticであるため、Box<Any + 'static>です。
  3. 形質が適切な生存期間を持たない場合は、外来型から推測されます。たとえば、&'a Fn()&'a (Fn() + 'a)です。
  4. それでも失敗した場合は、'static(機能署名用)または匿名有効期間(機能本体用)に戻ります。

f: Box<Fn() + Send + 'static>は、スレッド間で送信することができる(引数またはノーリターン値なしで)閉鎖、など(変更動的不明とオリジナルタイプを持つ)呼び出し可能な値に所有ポインタで結論とプログラムそのものに限ります。

+0

詳しい説明はMasakiありがとうございました! 1つのトピック外の質問: 'Box <&i32>'は、 'heap'にポインタ/参照を割り当て、'借用したコンテンツ(i32) '(それが指しているデータ)をスタックに置くことができるのでしょうか? 'b 'は私に'&i32'を与え、 '** b'は100を与えます(' let m = 100; b:Box= Box :: new(println! 'ここで' autorefs' – soupybionics

関連する問題