यह अंतर्निहित वैल कैसे स्टैक ओवर फ्लोएरर का कारण बनता है?स्कैला अंतर्निहित कारण StackOverflowError
(अपने मूल कोड नीचे मुकाबले, अभी भी त्रुटि पैदा करने के लिए)
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")))
}
}
मैं implicits के साथ कुछ अवैध कर रहा हूं?
क्या किसी को पता है कि यह सबमिट करने के लायक के रूप में योग्य है या नहीं? ऐसा लगता है कि मुझे एक अंतर्निहित रूपांतरण का दायरा है, उस रूपांतरण के परिभाषित कोड के भीतर मान्य नहीं होना चाहिए। (इस प्रकार, हमेशा बाहर रखा गया)। एकमात्र परिणाम जो कभी भी इसे अनुमति देने के लिए आ सकता है, हमेशा एक अनंत लूप होगा – LaloInDublin
मैंने एक मौका लिया कि यह संबोधित करने और इस मुद्दे को प्रस्तुत करने के लायक हो सकता है .. स्कैला प्रोग्रामिंग भाषा/एसआई -7693 – LaloInDublin
मुझे लगता है कि स्कैला कहना ज्यादा उचित है ऐसा करने के लिए कहा गया था (यानी एक बग नहीं)। समस्या जमा करने के लिए अच्छा है और देखें कि क्या होता है। शायद उपयोगकर्ता को पहचानने और चेतावनी देने का एक चालाक तरीका है। लेकिन, समस्या यह है कि रिकर्सन से पहले कोड की कोई मात्रा और जटिलता हो सकती है। इसके अलावा, शायद कोई उस रिकर्सन चाहता था और बाहर निकलने की स्थिति को कोडित कर दिया हो। – Core