scala:带状态的部分函数

scala:带状态的部分函数,scala,Scala,在scala中,我可以写: val pf: PartialFunction[String, Unit] = {case s => println(s)} 现在我可以传递pf,用适当的值调用它 我正在寻找一种简洁的方法来定义这样一个pf,这样它就可以有一个状态。说一个计数器,它被调用了多少次。一种方法是: var counter = 0 val pf: PartialFunction[String, Unit] = {case s => counter +=1; println(s)

在scala中,我可以写:

val pf: PartialFunction[String, Unit] = {case s => println(s)}
现在我可以传递pf,用适当的值调用它

我正在寻找一种简洁的方法来定义这样一个pf,这样它就可以有一个状态。说一个计数器,它被调用了多少次。一种方法是:

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

我不喜欢这里的方法,因为它不简洁,状态暴露。

发现了这种方法,尽管我并不完全满意:

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
case类PFS[S](var S:S)(pf:PartialFunction[(S,String),S])扩展PartialFunction[String,Unit]{
覆盖def isDefinedAt(str:String)=pf.isDefinedAt((s,str));
重写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]=
scala>pfs(“世界”)
你好,世界
scala>val-pfs=pfs(0){case(counter,str)=>println(str+counter);counter+1}
pfs:pfs[Int]=
scala>pfs(“世界”)
世界0
scala>pfs(“世界”)
世界1
scala>pfs(“世界”)
世界2
scala>pfs(“世界”)
世界3

始终定义部分函数。这只是一个例子,对吗?您需要分部函数类型吗?
val pf: PartialFunction[String, Unit] = {
    var counter = 0;
    {case s =>  {
            println(counter + s)
            counter +=1
        }
    }
}