In che modo questa valenza implicita causa uno StackOverFlowError?cause implicite scala StackOverflowError
(abita in fondo il mio codice originale, per causare ancora l'errore)
object Complicit {
// a class with name, default, and conversion function as implicit val
case class CC[A](name: String, defaultValue: A)(implicit val convert: String => A) {
def getFrom(s: String): A= try {
convert(s)
} catch {
case t: Throwable =>
println("ERROR: %s".format(t)) // just to see the StackOverflowException
defaultValue
}
}
// this works fine
object Works {
val cc1= CC("first", 0.1)(_.toDouble)
}
// this causes java.lang.StackOverflowError due to the implicit
object Fails {
// !!! StackOverFlowError here
implicit val stringToDouble: String => Double= { _.toDouble }
val cc2= CC("second", 0.2)
}
def main(args: Array[String]) {
// this works
println("%s %f".format(Works.cc1.name, Works.cc1.getFrom("2.3")))
// this fails
println("%s %f".format(Fails.cc2.name, Fails.cc2.getFrom("4.5")))
}
}
sto facendo qualcosa di illegale con impliciti?
Qualcuno sa se questo si qualifica come un bug che vale la pena presentare? Mi sembra lo scopo di una conversione implicita, non dovrebbe essere valido all'interno del codice che definisce questa conversione. (quindi, sempre escluso). L'unico risultato che è mai stato possibile ottenere, sarebbe sempre un ciclo infinito – LaloInDublin
Ho colto l'occasione che potrebbe valere la pena di affrontare e presentare il problema .. Scala Programming Language/SI-7693 – LaloInDublin
Penso che sia più giusto dire Scala ha fatto esattamente quello che è stato chiesto di fare (cioè non un bug). Buono a presentare il problema e vedere cosa succede. Forse c'è un modo intelligente per rilevare e avvisare l'utente. Ma il problema è che potrebbero esserci quantità e complessità di codice prima della ricorsione. Inoltre, forse qualcuno voleva quella ricorsione e ha codificato una condizione di uscita. – Core