Scala 3中变量赋值前使用却编译成功的异常问题
Scala 3中变量赋值前使用却编译成功的异常问题
嘿,这个问题乍一看确实有点反直觉对吧?我来给你拆解下到底发生了什么:
首先你写的这段代码其实是一个递归赋值的场景,把它补全大括号后逻辑会更清晰:
val x: Int = { val y: Int = x + 10 y }
Scala 3对于这种数值类型的递归val初始化,会先给x分配该类型的默认初始值——Int的默认值是0。所以当计算y = x + 10的时候,x此时的取值是默认的0,那y自然就是10,最后把y的值赋给x,所以最终x的结果就是10啦。
可能你会好奇为什么编译器没报错?这是因为Scala 3放宽了部分前向引用的限制,对于数值类型、引用类型这些有默认值的类型,允许在val的初始化表达式里引用自身,编译器会先用默认值完成初始计算,最后再把最终结果赋值给变量。
要是换成没有默认值的类型(比如自定义的case class),这种写法就会直接抛出初始化错误了,你可以试试,立马就能看到报错~
备注:内容来源于stack exchange,提问作者jakeis
相关产品推荐
相关产品推荐

