Archiv für November 2011

16
Nov
11

Extraktoren für Seq

Eine nützliche Funktion für Sequenzen ist indexOf, die die Position eines Elements innerhalb einer Sequenz bestimmt. Diese kann man in Extraktoren verpacken, z.B.:

object IndexOf {
   def unapply[T](pair:(Seq[T],T)):Option[Int] = {
     val index = pair._1.indexOf(pair._2)  
     if (index == -1) None else Some(index)
   }
}

object ReverseIndexOf {
   def unapply[T](pair:(Seq[T],T)):Option[Int] = {
     val index = pair._1.indexOf(pair._2)  
     if (index == -1) None else Some(pair._1.size - index - 1)
   }
} 

Nun kann man ein paar aus einer Sequenz und einem Element matchen:

def testIndexOf(n:Int) = (List(1,2,3,4,5,6,7),n) match {
  case IndexOf(0) => println("first")
  case IndexOf(1) => println("second")
  case ReverseIndexOf(1) => println("second to last")  
  case ReverseIndexOf(0) => println("last")  
  case IndexOf(x) => println("indexOf==" + x)
  case _ => println("not found")  
}

(1 to 8).foreach(testIndexOf(_))
//--> first
//--> second
//--> indexOf==2
//--> indexOf==3
//--> indexOf==4
//--> second to last
//--> last
//--> not found

In der vorliegenden Form ist das vielleicht noch nicht sooo furchtbar nützlich, aber das Prinzip lässt sich gut verallgemeinern. Ich finde es jedenfalls interessant, selbst Extraktoren zu schreiben, statt mich mit vorgefertigten oder durch Fallklassen autogenerierte Extraktoren zu begnügen.




Follow

Bekomme jeden neuen Artikel in deinen Posteingang.