Ok

En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies. Ces derniers assurent le bon fonctionnement de nos services. En savoir plus.

  • Un peu de Scala

    Voici un framework pubsub de la mort qui tue... 

     

    trait Idable {

       val id = Bus.getId

       def pub = Bus.pub(this)

       def sub(p:Idable, f:()=>Unit) = Bus.sub(p,f)

    }

    object Bus {

    val H = collection.mutable.HashMap[Long,List[()=>Unit]]()

    def pub(p:Idable):Unit = H.get(p.id).map(fs=>fs.map(f=> f()))

    def sub(p:Idable, f:()=>Unit):Unit = H.put(p.id,f :: H.get(p.id).getOrElse (List()))

    var ID = 0

    def getId:Long = {ID+=1; ID}

    }

    Il s'utilise assez simplement: 

     

    class Person (val name:String, var age:Int) extends Idable {
      def setAge(x:Int) = {age = x; pub}
    }
    object Main extends App with Idable {
      val p = new Person("me",33)
      sub(p, ()=> println("p notified " + p.age))
      p.setAge(34)
    }

     

    On utilise ici les closures bien sur, mais surtout les traits: Idable contient le comportement nécessaire à la signalisation via l'objet singleton Bus et aussi l'interface d'utilisation : pourvu qu'on soit "Idable", l'id et le Bus sont absolument invisibles. 

    Viva Scala !