val
-variables в Scala должны обладать следующими свойствами, обеспечивается во время компиляции, а не позже, во время выполнения:Как Scala компилятор работает с потенциальными несколькими присвоений значений
- неизменная переменная не может быть использована (а в " read ") перед назначением (привязкой).
- неизменяемая переменная не может быть назначена повторно после назначения один раз.
В соответствии с учебными пособиями и документами необязательно назначать непосредственно в точке объявления, если указан тип.
- 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}
?
Данные примеры не будут компилироваться в Scala. –
Pattern2 определен в пункте 8.1. –