Làm thế nào để val ngầm định này gây ra một StackOverFlowError?scala ngầm gây ra StackOverflowError
(pared xuống mã ban đầu của tôi, vẫn còn gây ra lỗi)
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")))
}
}
Tôi có làm một cái gì đó bất hợp pháp với implicits?
Có ai biết liệu điều này có đủ điều kiện để nhận lỗi không? Dường như với tôi phạm vi của một chuyển đổi tiềm ẩn, không nên hợp lệ trong mã xác định của chuyển đổi đó. (do đó, luôn bị loại trừ). Kết quả duy nhất có thể đến từ việc cho phép điều này, luôn luôn là một vòng lặp vô hạn – LaloInDublin
Tôi nắm lấy cơ hội này có thể đáng để giải quyết và gửi vấn đề .. Ngôn ngữ lập trình Scala/SI-7693 – LaloInDublin
Tôi nghĩ rằng đó là công bằng hơn khi nói Scala đã làm những gì nó đã được yêu cầu làm (tức là không phải là một lỗi). Tốt để gửi vấn đề và xem những gì sẽ xảy ra. Có thể có một cách thông minh để phát hiện và cảnh báo người dùng. Nhưng, vấn đề là có thể có bất kỳ số lượng và sự phức tạp của mã trước khi đệ quy. Ngoài ra, có lẽ ai đó muốn đệ quy đó và đã mã hóa một điều kiện thoát. – Core