Кога е добре да използвате var в Scala?

Знам, че Scala има var (за променливо състояние), но чистото функционално програмиране обезсърчава използването на всяко променливо състояние и по-скоро се фокусира върху използването на val за всичко.

Идвайки от императивен свят, трудно е да се откажеш от променливото състояние.

Въпросът ми е кога е добре да използвате var във вашия Scala код? Може ли целият код наистина да бъде направен само с помощта на val. Ако да, тогава защо Scala има vars?


person Soumya Simanta    schedule 27.10.2012    source източник
comment
Предполагам, че искате да попитате тогава защо Scala има vars.   -  person pedrofurla    schedule 27.10.2012
comment
@pst - Прав си, Scala не е чиста. Предполагам, че това е една от причините да има vars. Първоначалният ми въпрос обаче все още остава.   -  person Soumya Simanta    schedule 27.10.2012


Отговори (2)


Ето някои причини за vars в Scala:

  • Scala е многопарадигмен език, насърчава функционалното програмиране, но оставя избора на програмиста.
  • Съвместимост: Много Java API излагат променливи променливи.
  • Производителност: Понякога използването на променлива ви дава възможно най-добрата производителност.
  • Когато хората казват, че всичко може да бъде направено без vars, това е правилно в смисъл, че Scala все още ще работи напълно без vars. Това обаче не променя нищо относно валидността на предишните точки.
person Kim Stebel    schedule 27.10.2012
comment
Благодаря за страхотния отговор. Но можете ли да ни предоставите някаква справка за Scala would still be turing complete without vars. - person Vishrant; 12.07.2018
comment
Току-що попаднах на случай, в който var имаше смисъл: трябваше да напиша обща функция, която събира някои цели числа в битова маска. Създадох функция, която направи акумулатор на променлива и след това при определени условия добави стойности към тази променлива и след това върна крайния резултат. Променливата не е изложена на друг код, капсулиран в една функция. Това може да бъде пренаписано, за да се използва val, но за всеки случай, който се нуждае от добавяне към оригиналната var, ще трябва да създадете нов val, който да добавите към него за израза return. Използването на val тук би увеличило използването на паметта в името на неизменността... - person Rimer; 25.03.2020

Дори от гледна точка на функционалното програмиране, можете да използвате променливи (или променливи обекти) локално, ако не напускат обхвата, където са дефинирани.

Например, разгледайте тази (измислена) функция, която връща размера на списък:

def dumbSize( lst: List[Int] ): Int = {
   var i = 0
   var rest = lst
   while( rest != Nil ) {
     i += 1
     rest = rest.tail
   }
   i
}

Въпреки че тази (грозна) функция използва vars, тя все още е чиста (няма странични ефекти и винаги ще връща същия резултат за дадена стойност на аргумент).

Друг пример за "променливо-състояние-капсулиране" е моделът на актьора, където състоянието на актьора често е променливо.

person paradigmatic    schedule 27.10.2012
comment
Мисля, че имахте предвид rest.tail - person Kim Stebel; 27.10.2012
comment
и заменете последното rest с i - person Kim Stebel; 27.10.2012
comment
също така трябва да замените rest.size > 0 с rest != Nil, за да нямате квадратична производителност - person Kim Stebel; 27.10.2012
comment
или това беше само за да се демонстрира погрешността на императивното програмиране? ;) - person Kim Stebel; 27.10.2012
comment
@KimStebel Отстраних грешки, благодаря. Просто исках да илюстрирам как една функция все още може да бъде чиста, докато използва неизменен (податлив на грешки) код. - person paradigmatic; 27.10.2012
comment
@KimStebel Наистина съм изумен от броя на грешките, които успях да напълня в тази малка функция! Благодаря за поправката. - person paradigmatic; 27.10.2012
comment
аз също, първо забелязах грешките и след това видях името ви там и се замислих наистина?? - person Kim Stebel; 27.10.2012