var VS val

В Scala существуют два типа переменных, константные и изменяемые. На фоне большинства мэйнстрим языков, подход выглядит довольно странно: константные “переменные” декларируются посредства ключевого слова val, для создания изменяемых переменных используется ключевое слово var.

Столкнувшись с таким подходом, первый заинтересовавший меня вопрос был “есть ли какая-то разница на уровне JVM в var и val?”. Возьмем простейший пример:

    val str1 : String = "String1";
    var str2 : String = "String2";

Что будет скомпилированно в:

   0:   ldc #23; //String String1
   2:   astore_2
   3:   ldc #25; //String String2
   5:   astore_3

Итого: как и ожидалось, никакой разницы нет, просто проверка на этапе компиляции.

И еще пара моментов. Параметр функции всегда константа:

  def fn(arg : String) {
//    arg = "Test"; // error: reassignment to val
  }

В отличие от параметров конструктора, которые могут быть как константными, так и изменяемыми переменными. Для получения изменяемого параметра, необходимо явно это указать при помощи var.

class TestClass(v1 : String,  var v2 : String) {
//  v1 = "NewVal" // error: reassignment to val
  v2 = "NewVal"
}

На мой взгляд, поход довольно запутанный и не очень удобный, различать константа/не константа по одной букве довольно затруднительно. Но, что есть – то есть.

2 Comments var VS val

  1. NN

    На мой взгляд лучшее решение в Nemerle.
    def – иммутабельная переменая.
    mutable – мутабельная.

    Отличить одно от другого довольно просто.
    Более того длинное слово подталкивает его реже использовать

    Reply
    1. Alexander Stavonin

      А мне как-то больше дополнительное слово, типа const/final симпатично Дело привычки.
      Хотя, решение в Nemerle однозначно удобнее чем решение в Scala.

      Reply

Leave a Reply to Alexander Stavonin Cancel reply