2016-08-04 3 views
1

val -variables в Scala должны обладать следующими свойствами, обеспечивается во время компиляции, а не позже, во время выполнения:Как Scala компилятор работает с потенциальными несколькими присвоений значений

  1. неизменная переменная не может быть использована (а в " read ") перед назначением (привязкой).
  2. неизменяемая переменная не может быть назначена повторно после назначения один раз.

В соответствии с учебными пособиями и документами необязательно назначать непосредственно в точке объявления, если указан тип.

Но это, кажется, создает лазейку

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}?

+1

Данные примеры не будут компилироваться в Scala. –

+1

Pattern2 определен в пункте 8.1. –

ответ

1

Это незаконно:

val const2 : Int 
const2 = 0 

val s не могут быть переназначены после декларации, период.

+0

Если вы добавляете членство в классе, вы можете объявлять неопределенные члены. Но даже тогда я не думаю, что мы можем создать сценарий, предоставленный OP. –

+0

@SarveshKumarSingh Вы можете объявить их, но вы не можете переназначить их после объявления. –

+0

, но каково было бы значение 'const2' без присваивания, которое выполняется во второй строке? Можете ли вы указать спецификации, что назначение за пределами декларации запрещено даже один раз? –