2009-12-02 5 views
2
fonction partielle

SCALA Je peux écrire:scala: avec l'état

val pf: PartialFunction[String, Unit] = {case s => println(s)} 

Maintenant, je peux passer autour de PF, appelant les valeurs appropriées.

Je cherche une façon concise de pouvoir définir un tel pf pour qu'il puisse avoir un état. Dites un compteur du nombre de fois qu'il a été appelé. Une façon est la suivante:

var counter = 0 
val pf: PartialFunction[String, Unit] = {case s => counter +=1; println(s)} 

Ce que je n'aime pas ici est que ce n'est pas concis et l'état est exposé.

+1

Votre fonction partielle est toujours définie. Ceci est juste un exemple, non? Vous avez besoin du type de fonction partielle? –

Répondre

4
val pf: PartialFunction[String, Unit] = { 
    var counter = 0; 
    {case s => { 
      println(counter + s) 
      counter +=1 
     } 
    } 
} 
+0

Je reçois des erreurs de compilation lorsque j'essaie ... – xitrium

0

trouvé cette approche, bien que je ne suis pas entièrement satisfait avec elle:

case class PFS[S](var s: S)(pf: PartialFunction[(S,String), S]) extends PartialFunction[String, Unit] { 
    override def isDefinedAt(str: String) = pf.isDefinedAt((s, str)); 
    override def apply(str: String) = {s = pf((s, str));()} 
} 

scala> val pfs = PFS("hello ") {case (s1, s2) => println(s1 + s2); s1} 
pfs: PFS[java.lang.String] = <function> 

scala> pfs("world") 
hello world 

scala> val pfs = PFS(0) {case (counter, str) => println(str + counter); counter + 1} 
pfs: PFS[Int] = <function> 

scala> pfs("world") 
world0 

scala> pfs("world") 
world1 

scala> pfs("world") 
world2 

scala> pfs("world") 
world3