Когда можно использовать "var" в Scala?
Я знаю, что Scala имеет var
(для изменяемого состояния), но чисто функциональное программирование препятствует использованию любого изменяемого состояния и скорее фокусируется на использовании val
для всего.
Из императивного мира трудно отказаться от изменчивого состояния.
Мой вопрос в том, когда можно использовать var в коде Scala? Может ли все код действительно выполняться с использованием только val. Если да, то почему у Scala есть вары?
Ответы
Ответ 1
Вот несколько причин для vars в Scala:
- Scala - это язык с несколькими парадигмами, он поощряет функциональное программирование, но оставляет выбор программисту.
- Доступность: многие API Java выставляют изменяемые переменные.
- Производительность: иногда использование var дает вам наилучшую производительность.
- Когда люди говорят, что все может быть сделано без vars, это правильно в том смысле, что Scala все равно будет совершенствовать без vars. Однако это ничего не меняет в отношении действительности предыдущих пунктов.
Ответ 2
Даже с точки зрения функционального программирования вы можете использовать vars (или изменяемые объекты) локально, если они не оставляют область, в которой они определены.
Например, рассмотрим эту (надуманную) функцию, которая возвращает размер списка:
def dumbSize( lst: List[Int] ): Int = {
var i = 0
var rest = lst
while( rest != Nil ) {
i += 1
rest = rest.tail
}
i
}
Хотя эта (уродливая) функция использует vars, она по-прежнему чиста (побочных эффектов нет и она всегда будет возвращать один и тот же результат для заданного значения аргумента).
Другим примером "инкапсуляции с изменяемым состоянием" является модель актера, в которой состояние актера часто изменяется.