2009-12-02 2 views
2

В Скале я могу написать:Scala: с частично определённая функция государства

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

Теперь я могу передать пф вокруг, вызывая его с соответствующими значениями.

Я ищу сжатый способ определения такого pf, чтобы он мог иметь состояние. Скажите счетчик, сколько раз он был вызван. Один из способов заключается в следующем:

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

Что мне не нравится в том, что это не так сжато и государство подвергается.

+1

Ваша частичная функция всегда определена. Это всего лишь пример, верно? Вам нужен частичный тип функции? –

ответ

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

Я получаю ошибки компиляции, когда я пытаюсь это сделать ... – xitrium

0

Найдено этот подход, хотя я не совсем доволен этим:

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 
Смежные вопросы