Scala 编译器如何处理潜在的多重赋值
How Scala compiler deals with potential multiple assignments of values
val
-Scala 中的变量应具有以下属性,在编译期间确保,而不是稍后在运行时:
- 不可变变量在分配给(绑定)之前不能使用("read"中的a)。
- 不可变变量赋值一次后不能再次赋值
根据教程和文档,只要指定了类型,就不需要在声明点立即分配 val
。
- http://www.tutorialspoint.com/scala/scala_variables.htm
- http://www.scala-lang.org/files/archive/spec/2.11/04-basic-declarations-and-definitions.html#value-declarations-and-definitions
但这似乎造成了漏洞
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
val
s不能在声明后重新赋值,句号。
val
-Scala 中的变量应具有以下属性,在编译期间确保,而不是稍后在运行时:
- 不可变变量在分配给(绑定)之前不能使用("read"中的a)。
- 不可变变量赋值一次后不能再次赋值
根据教程和文档,只要指定了类型,就不需要在声明点立即分配 val
。
- http://www.tutorialspoint.com/scala/scala_variables.htm
- http://www.scala-lang.org/files/archive/spec/2.11/04-basic-declarations-and-definitions.html#value-declarations-and-definitions
但这似乎造成了漏洞
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
val
s不能在声明后重新赋值,句号。