1

このブロックのタイプは何ですか: callback: => Unit?

に割り当てるにはどうすればよいOptionですか? つまり、次のコードを更新して、コンパイル エラーが発生しないようにする方法を教えてください。

  var onEventCallback: Option[() => Unit] = None

  def onEvent(callback: => Unit) {
    onEventCallback = Some(callback)  // HERE compilation error: Some[Unit] doesn't conform to Option[() => Unit] 
  }

Ok。Some(callback _)の代わりに使用して解決しましたSome(callback)。しかし、なぜこれが機能するのですか?

4

2 に答える 2

4

コンパイラは、コールバックをすぐに実行するかどうかを知る必要があります。アンダースコアがない場合、即時実行が想定され、結果が Some に割り当てられます。アンダースコアを使用すると、コンパイラはコールバックを実行して結果を取得するべきではなく、それを Some コンストラクター (または apply() メソッド) に渡すパラメーターとして扱う必要があることを認識します。

于 2013-07-26T06:18:26.120 に答える
3

しかし、なぜこれが機能するのですか?

場合によっては、by-nameパラメーターを引数のない関数と考えることができます。実際にはコンパイラのFunction0アフターerasureフェーズです。-Xprint:erasureこれを確認するには、次のコードをコンパイルします。

def onEvent(callback: Function0): Unit = onEventCallback_=(new Some(callback))
于 2013-07-26T06:22:11.530 に答える