k47.cz  — každý den dokud se vám to nezačne líbit
foto Praha výběr povídky kultura
twitter FB RSS

Scala - klasický for cyklus

3. 1. 2011 — k47 (CC by) (♪)

Scala, na rozdíl od jazyků z rodiny C/C++, ne­ob­sa­huje for cyklus, pro­tože je podle Mar­tina Ode­r­skyho příliš im­pe­ra­tivní a Scala jako taková hodně tíhne k funk­ci­o­nál­nímu jazyku.

Nicméně, to nám ne­brání si tuto ja­zy­ko­vou kon­strukci do­pl­nit. Tady jsou moje tři po­kusné im­ple­men­tace.


// negenerická verze
def classicFor0(init: Int, cond: Int => Boolean, incr: Int => Int)(op: Int => Unit) {
  var i = init
  while (cond(i)) {
    op(i)
    i = incr(i)
  }
}

// použití
classicFor0(0, _ < 10, _ + 1) { i =>
  println(i)
}
// generická verze 1
def classicFor1[@specialized T](init: T, cond: T => Boolean, incr: T => T)(op: T => Unit) {
  var i = init
  while (cond(i)) {
    op(i)
    i = incr(i)
  }
}

// použití
// typová anotace [Int] je tady potřeba, protože kompilátor nedokáže odvodit typ fukncí cond a incr
classicFor1[Int](0, _ < 10, _ + 1) { i =>
  println(i)
}
// generická verze 2
def classicFor2[@specialized T](init: T)(cond: T => Boolean, incr: T => T)(op: T => Unit) {
  var i = init
  while (cond(i)) {
    op(i)
    i = incr(i)
  }
}

// použití
// žádná typová anotace netřeba za cenu jiného zápisu
classicFor2(0)(_ < 10, _ + 1) { i =>
  println(i)
}

Vý­sle­dek bo­hu­žel není tak fle­xi­bilní jako for cyklus v ja­zy­cích, které ho mají ve­sta­věný v jazyce.

píše k47 & hosté, ascii@k47.cz