Scala 编译器如何处理潜在的多重赋值

How Scala compiler deals with potential multiple assignments of values

val-Scala 中的变量应具有以下属性,在编译期间确保,而不是稍后在运行时:

  1. 不可变变量在分配给(绑定)之前不能使用("read"中的a)。
  2. 不可变变量赋值一次后不能再次赋值

根据教程和文档,只要指定了类型,就不需要在声明点立即分配 val

但这似乎造成了漏洞

def fn1(x: Int, y: Int): Int = {
  val const2 : Int

  const2 = 0
  if (x < 10) const2 = x
  if (y > 10) const2 = y

  const2
}

def fn2(x: Int, y: Int): Int = {
  val const2 : Int
  var i: Int

  for( i <- x to y ){
    const2 = 0
  }

  const2
}

在这两个示例中,编译器似乎无法预测赋值是否为单数。所以编译器没有资格禁止编译这段代码,但它同样没有理由保证val-变量在运行时可能的每个执行路径中的单一赋值性质。

无论编译器会做什么,编译代码或抛出错误,它都可能以错误的方式结束。那么在规范方面它应该做什么?

PS。文档的一个小问题:第 4.1 章说
PatDef ::= Pattern2 {‘,’ Pattern2}
为什么 "Pattern2" 重复并且具有相同的数字索引? 它应该只是 Pattern {‘,’ Pattern} 而不是 Pattern1 {‘,’ Pattern2} 吗?

这是非法的:

val const2 : Int
const2 = 0

vals不能在声明后重新赋值,句号。