0
C++では、静的メンバーのおかげで、静的に登録されたコールバックを持つディスパッチャコールバックパターンを実装できます。しかし、Scalaでは、すべてのオブジェクトが遅延初期化されているので、以下のコードはC++で同様のことはしません。Scalaにコールバックを静的に登録する方法は?
object Main {
var callbacks = List[()=>Unit]()
def main(args: Array[String]): Unit = {
println("hello")
callbacks.foreach { _() }
}
}
object A {
val callbackA =() => println("A")
Main.callbacks = callbackA::Main.callbacks
}
object B {
val callbackB =() => println("B")
Main.callbacks = callbackB::Main.callbacks
}
object C {
val callbackC =() => println("C")
Main.callbacks = callbackC::Main.callbacks
}
私はこのプログラムを実行すると、オブジェクトA、B、およびCが初期化されることはありませんし、登録が実行されることはありませんので、コールバックのいずれも、呼び出されません。 Scalaに私がここで意図していることを正しく実装する方法がありますか?
のコードを参照してください 'A'は、 'B'とは、 'C'は、実際に実行されることはありません。したがって、 'main'メソッドは' foreach'を使って空のコレクションを繰り返し処理します。私はあなたの意図が何であるか分かりません。 – PermaFrost
@PermaFrost同様のことがC++やJavaで書かれていると仮定します。 Scalaで同じことが可能かどうかを知りたい。具体的には、ディスパッチャーが存在を知らずにコールバックを登録する必要があります。 LLVMパスの登録方法と同様です。 – uraj
Javaでこれをどのように書くのかを示すべきでしょう。 Javaの静的メンバーも遅延初期化されます。 –