9

C#では、クラスとインターフェイスにevent次のものを含めることができます。

public class Foo
{
    public event Action SomethingHappened;

    public void DoSomething()
    {
        // yes, i'm aware of the potential NRE
        this.SomethingHappened();
    }
}

これにより、最小限の定型コードでプッシュベースの通知が容易になり、複数のサブスクライバーモデルが有効になるため、多くのオブザーバーがイベントを聞くことができます。

var foo = new Foo();
foo.SomethingHappened += () => Console.WriteLine("Yay!");
foo.DoSomething();  // "Yay!" appears on console. 

Scalaに同等のイディオムはありますか?私が探しているのは:

  1. 最小限の定型コード
  2. 単一のパブリッシャー、複数のサブスクライバー
  3. サブスクライバーのアタッチ/デタッチ

Scalaドキュメントでの使用例は素晴らしいでしょう。ScalaでのC#イベントの実装を探していません。むしろ、私はScalaで同等のイディオムを探しています。

4

2 に答える 2

2

Scalaの慣用的な方法は、オブザーバーパターンを使用しないことです。オブザーバーパターンの廃止を参照してください。

実装については、この回答をご覧ください。

于 2013-01-24T14:24:43.130 に答える
2

これは、ScalaでC#イベントを実装する方法についての素晴らしい記事です。これは本当に役立つと思います。

基本イベントクラス。

class Event[T]() {

  private var invocationList : List[T => Unit] = Nil

  def apply(args : T) {
    for (val invoker <- invocationList) {
      invoker(args)
    }
  }

  def +=(invoker : T => Unit) {
    invocationList = invoker :: invocationList
  }

  def -=(invoker : T => Unit) {
    invocationList = invocationList filter ((x : T => Unit) => (x != invoker))
  }

}

と使用法;

val myEvent = new Event[Int]()

val functionValue = ((x : Int) => println("Function value called with " + x))
myEvent += functionValue
myEvent(4)
myEvent -= functionValue
myEvent(5)
于 2013-01-24T14:29:18.913 に答える