この暗黙的なvalによってStackOverFlowErrorがどのように発生しますか?スカラー暗黙の原因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")))
}
}
私は暗黙で違法な何かをやっていますか?
提出する価値のあるバグは誰にも分かりますか?私には暗黙の変換の範囲があり、その変換の定義コード内では有効ではないはずです。 (従って、常に除外される)。これを可能にすることができる唯一の結果は、常に無限ループになります – LaloInDublin
私はこれがアドレッシングになる可能性があるチャンスを取って問題を提出しました.. Scala Programming Language/SI-7693 – LaloInDublin
(バグではなく)何をするように求められたのかだけでした。問題を提出し、何が起こるかを確認するのは良いことです。たぶん、ユーザーを検出して警告する巧妙な方法があります。しかし、問題は再帰の前にコードの量と複雑さがあることです。また、誰かがその再帰を望み、終了条件をコーディングした可能性があります。 – Core