Forse per consentire di ereditare da un Traversable
, e fare qualche uso del valore di ritorno U
da f: A => U
?
trait TraversableWithHandler[+A, E <: Option[Throwable]] extends Traversable[A] {
override def foreach[U](f: A => U): Unit
def handleError(t: E)
}
Ad esempio in jQuery
, ritorno di false
dall'interno foreach
è equivalente a break
, qualsiasi valore diverso è un continue
.
Use Case
breakable {
List(1,2,3).foreach(_ match {
case 1 => println("ok")
case 2 =>
println("Sort of, soft interrupt?")
return false
case 3 => break
})
}
Poiché il codice successivo (parallelo), non si rompe mai (soluzione Throwable stackless sembra non ideale in questo caso?):
import scala.util.control.Breaks._
breakable {
(0 to 100).toList.par.foreach(_ match {
case n if (n <= 50) =>
println("#" * 100)
try { break } catch {
case t: Throwable => println("" + t); break
}
case n if (n > 50) =>
println("" + n)
case _ => "ok"
})
}
Non ho il tempo di fare un esempio, ma ho il forte sospetto che sia per consentire al tipo di inferenza di ignorare 'foreach' quando si tratta di inferire il tipo di ritorno di una funzione. Ma non conosco un caso dalla mia testa dove sarebbe importante (cioè che "Qualsiasi" non risulterebbe nella stessa inferenza). –