val и var
Неизменяемые и изменяемые привязки.
«val и var» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Два способа именовать значения
В Scala имя связывается со значением с помощью val или var.
val создаёт неизменяемую связь: после присваивания она уже никогда не сможет указывать на другое значение. var создаёт изменяемую связь, которой позднее можно присвоить другое значение.
Выбор между ними — одна из первых привычек, которые формирует разработчик серверной части на Scala.
val name = "Ada"
var score = 10Определение val
val доступен только для чтения. Вы присваиваете ему значение один раз, и компилятор гарантирует, что оно не изменится.
Благодаря этому код проще анализировать: val никогда не удивит Вас изменившимся где-то ещё значением.
object Main extends App {
val pi = 3.14
println(pi)
}Ошибка при повторном присваивании val
Попытка повторно присвоить значение val приводит к ошибке компиляции, а не к сбою во время выполнения. Компилятор остановит Вас ещё до запуска программы.
Приведённый ниже фрагмент завершился бы ошибкой reassignment to val.
val country = "Turkey"
country = "Spain" // error: reassignment to valОпределение var
Значению var можно присваивать новые значения сколько угодно раз, если новое значение имеет совместимый тип.
Используйте var, когда значение действительно должно изменяться со временем, например для счётчика в цикле.
object Main extends App {
var count = 0
count = count + 1
count = count + 1
println(count)
}var сохраняет свой тип
Хотя значение var можно менять, его тип фиксируется при определении.
Если level изначально имеет тип Int, позднее нельзя сохранить в нём String. Компилятор отклонит такое несоответствие.
var level = 1
level = 5 // ok, still an Int
level = "high" // error: type mismatchПо умолчанию предпочитайте val
Идиоматический Scala почти всегда отдаёт предпочтение val. Неизменяемость предотвращает целые классы ошибок и делает параллельный код безопаснее.
- Сначала выбирайте
val. - Переходите на
var, только если Вам действительно нужно изменять значение.
Замена var на val
Многие циклы, которым, на первый взгляд, нужен var, можно выразить с помощью val и выражения.
Здесь сумма вычисляется с помощью диапазона и sum, поэтому изменение значения не требуется.
object Main extends App {
val total = (1 to 5).sum
println(total)
}Область видимости связи
И val, и var существуют внутри блока { ... }, в котором они определены.
Связь, объявленная внутри блока, не видна за его пределами. Это упорядочивает имена и предотвращает их случайное повторное использование.
object Main extends App {
val outer = 1
{
val inner = 2
println(outer + inner)
}
// inner is not visible here
}Ленивый val
lazy val вычисляется только при первом использовании, а затем кэшируется.
Это удобно для затратных вычислений, которые могут понадобиться не всегда. Тело выполняется не более одного раза.
object Main extends App {
lazy val greeting = { println("computing"); "Hi" }
println("before")
println(greeting)
println(greeting)
}val с явным типом
Тип связи можно указать после двоеточия. Это документирует намерение и позволяет намеренно расширить тип.
Здесь amount объявлен как Double, хотя 10 выглядит как Int.
val amount: Double = 10
val label: String = "price"val и var: сравнение
Они ведут себя одинаково, пока Вы не попробуете присвоить значение повторно.
val x: присваивание один раз, затем значение неизменно.var y: свободные присваивания и повторные присваивания.
Приведённая ниже программа увеличивает только var.
object Main extends App {
val base = 100
var bonus = 0
bonus = bonus + 25
println(base + bonus)
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли val и var.
Итоги
Вы узнали о двух способах связывать имена со значениями в Scala.
valнеизменяем и используется по умолчанию.varизменяем и предназначен для значений, которые должны меняться.- Повторное присваивание
val— ошибка компиляции. - Типы обоих видов связей фиксированы;
lazy valоткладывает вычисление.
Часто задаваемые вопросы
Урок «val и var» бесплатный?
Да — полный текст урока «val и var» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Чему я научусь в уроке «val и var»?
Неизменяемые и изменяемые привязки. Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?
Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «val и var»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?
Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.