В Scala существуют два типа переменных, константные и изменяемые. На фоне большинства мэйнстрим языков, подход выглядит довольно странно: константные “переменные” декларируются посредства ключевого слова val, для создания изменяемых переменных используется ключевое слово var.
Столкнувшись с таким подходом, первый заинтересовавший меня вопрос был “есть ли какая-то разница на уровне JVM в var и val?”. Возьмем простейший пример:
var str2 : String = "String2";
Что будет скомпилированно в:
2: astore_2
3: ldc #25; //String String2
5: astore_3
Итого: как и ожидалось, никакой разницы нет, просто проверка на этапе компиляции.
И еще пара моментов. Параметр функции всегда константа:
// arg = "Test"; // error: reassignment to val
}
В отличие от параметров конструктора, которые могут быть как константными, так и изменяемыми переменными. Для получения изменяемого параметра, необходимо явно это указать при помощи var.
// v1 = "NewVal" // error: reassignment to val
v2 = "NewVal"
}
На мой взгляд, поход довольно запутанный и не очень удобный, различать константа/не константа по одной букве довольно затруднительно. Но, что есть – то есть.
На мой взгляд лучшее решение в Nemerle.
def – иммутабельная переменая.
mutable – мутабельная.
Отличить одно от другого довольно просто.
Более того длинное слово подталкивает его реже использовать
А мне как-то больше дополнительное слово, типа const/final симпатично Дело привычки.
Хотя, решение в Nemerle однозначно удобнее чем решение в Scala.