2013-08-20 3 views
3

Я получаю сообщение об ошибке при попытке выполнить приведенный ниже код из Eclipse, потому что я не могу переназначить Val, правильно?поведение Val в Scala

object Test { 
    def main(args: Array[String]){ 
     val tempVal = 100; 

     val checkval = if (tempVal > 50) 1 else 0 

     println("The new value is: " + checkval); 

     //Getting Error Below 
     checkval1 = if (tempVal > 200) 0 

    } 
} 

Теперь, когда я пытаюсь сделать то же самое из командной строки, почему я не получаю такую ​​же ошибку?

enter image description here

ответ

7

В РЕПЛ, каждое заявление вы набираете будет обернуто внутри объекта, который вложен внутри объекта предыдущего заявления. Это делается специально для того, чтобы вы могли «изменить» значение val s или class es или trait s позже. В противном случае вам придется перезапустить REPL и повторно указывать каждый оператор каждый раз, когда вы делаете опечатку.

Итак, ваша РЕПЛА сессия (примерно) компилируются в чем-то вроде этого:

object Line1 { 
    val x = 100 
    println(x) 

    object Line2 { 
    val y = if (x < 50) 1 else 0 
    println(y) 

    object Line3 { 
     val y = if (x < 50) 0 else 1 
     println(y) 
    } 
    val _ = Line3 // force creating the Line3 object 
    } 
    val _ = Line2 // force creating the Line2 object 
} 
val _ = Line1 // force creating the Line1 object 

Поскольку Скалы вложенные прицелов, Line3 's y может тень Line2' ы y.

+0

Это ясно объясняет мне дизайн. Очень хорошее объяснение. Спасибо @ Йорг. –

+0

thx. ясно и легко объяснить. – Curry

8

Вы не делаете то же - вы просто переопределены (слежка *) Валя, не переназначен новое значение к нему. Если вы напишете y = if (x < 50) 0 else 1 вместо val y = if (x < 50) 0 else 1, вы получите сообщение об ошибке.

enter image description here

* это возможно только в РЕПЛ

+0

Спасибо. Это означает, что каждый раз, когда я буду переопределять val с тем же именем, он будет теневать предыдущий val, правильно? –

+1

@SudiptaDeb: не в нормально скомпилированном коде (вы все равно не сможете это сделать). Тем не менее, REPL позволяет повторно перехватить 'val'. –

+0

@ TheTerribleSwiftTomato: Точно, когда я пытаюсь сделать то же самое с Eclipse, это не позволяет мне писать сам код. Но в REPL он выполняет тень предыдущего val. –

Смежные вопросы