W jaki sposób niejawny val powoduje błąd StackOverFlowError?niejawne przyczyny scala StackOverflowError
(pominięto w mój oryginalny kod, aby nadal spowodować błąd)
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")))
}
}
robię coś nielegalnego z implicits?
Czy ktoś wie, czy kwalifikuje się jako błąd warty przesłania? Wydaje mi się, że zakres niejawnej konwersji nie powinien być prawidłowy w ramach kodu definiującego tę konwersję. (w związku z tym zawsze wyłączone). Jedynym rezultatem, który mógłby nadejść z tego powodu, byłaby zawsze nieskończona pętla. – LaloInDublin
Zaryzykowałem to, być może warto było zająć się i przesłałem problem. Scala Programming Language/SI-7693 – LaloInDublin
Myślę, że bardziej sprawiedliwie jest mówić Scala zrobił dokładnie to, o co go poproszono (tj. nie błąd). Dobrze jest zgłosić problem i zobaczyć, co się stanie. Może istnieje sprytny sposób na wykrycie i ostrzeżenie użytkownika. Ale problem polega na tym, że przed rekurencją może istnieć dowolna ilość i złożoność kodu. Być może ktoś chciał tej rekursji i zakodował warunki wyjścia. – Core