Scala 3 — Book

Переменные и типы данных

Language

В этом разделе представлен обзор переменных и типов данных Scala.

Два вида переменных

Когда вы создаете новую переменную в Scala, то объявляете, является ли переменная неизменяемой или изменяемой:

Тип переменной Описание
val Создает неизменяемую переменную — как final в Java. Вы всегда должны создавать переменную с val, если нет причины, по которой вам нужна изменяемая переменная.
var Создает изменяемую переменную и должна использоваться только в том случае, если содержимое переменной будет меняться с течением времени.

Эти примеры показывают, как создавать val и var переменные:

// неизменяемая
val a = 0

// изменяемая
var b = 1

В программе val переназначить нельзя. Появится ошибка компилятора, если попытаться её изменить:

val msg = "Hello, world"
msg = "Aloha"   // ошибка "reassignment to val"; этот код не скомпилируется

И наоборот, var можно переназначить:

var msg = "Hello, world"
msg = "Aloha"   // этот код скомпилируется, потому что var может быть переназначена

Объявление типов переменных

Когда вы создаете переменную, то можете явно объявить ее тип или позволить компилятору его вывести:

val x: Int = 1   // явно
val x = 1        // неявно; компилятор выводит тип

Вторая форма известна как вывод типа, и это отличный способ сделать кратким код такого типа. Компилятор Scala обычно может определить тип данных за вас, как показано в выводе этих примеров REPL:

scala> val x = 1
val x: Int = 1

scala> val s = "a string"
val s: String = a string

scala> val nums = List(1, 2, 3)
val nums: List[Int] = List(1, 2, 3)

Вы всегда можете явно объявить тип переменной, если хотите, но в простых присваиваниях, подобных нижеследующим, в этом нет необходимости:

val x: Int = 1
val s: String = "a string"
val p: Person = Person("Richard")

Обратите внимание, что при таком подходе код кажется более многословным, чем необходимо.

Встроенные типы данных

Scala поставляется со стандартными числовыми типами данных, которые вы ожидаете, и все они являются полноценными экземплярами классов. В Scala все является объектом.

Эти примеры показывают, как объявлять переменные числовых типов:

val b: Byte = 1
val i: Int = 1
val l: Long = 1
val s: Short = 1
val d: Double = 2.0
val f: Float = 3.0

Поскольку Int и Double являются числовыми типами по умолчанию, то обычно они создаются без явного объявления типа:

val i = 123   // по умолчанию Int
val j = 1.0   // по умолчанию Double

В своем коде вы также можете добавлять символы L, D и F (и их эквиваленты в нижнем регистре) к числам, чтобы указать, что они являются Long, Double или Float значениями:

val x = 1_000L   // val x: Long = 1000
val y = 2.2D     // val y: Double = 2.2
val z = 3.3F     // val z: Float = 3.3

Когда вам нужны действительно большие числа, используйте типы BigInt и BigDecimal:

var a = BigInt(1_234_567_890_987_654_321L)
var b = BigDecimal(123_456.789)

Где Double и Float - это приблизительные десятичные числа, а BigDecimal используется для точной арифметики.

В Scala также есть типы данных String и Char:

val name = "Bill"   // String
val c = 'a'         // Char

Строки

Строки Scala похожи на строки Java, но у них есть две замечательные дополнительные функции:

  • Они поддерживают интерполяцию строк
  • Легко создавать многострочные строки

Строковая интерполяция

Интерполяция строк обеспечивает очень удобный способ использования переменных внутри строк. Например, учитывая эти три переменные:

val firstName = "John"
val mi = 'C'
val lastName = "Doe"

Вы можете объединить эти переменные в строку следующим образом:

println(s"Name: $firstName $mi $lastName")   // "Name: John C Doe"

Просто поставьте перед строкой букву s, а затем поставьте символ $ перед именами переменных внутри строки.

Чтобы вставить произвольные выражения в строку, заключите их в фигурные скобки:

println(s"2 + 2 = ${2 + 2}")   // prints "2 + 2 = 4"

val x = -1
println(s"x.abs = ${x.abs}")   // prints "x.abs = 1"

Символ s, помещенный перед строкой, является лишь одним из возможных интерполяторов. Если использовать f вместо s, можно использовать синтаксис форматирования в стиле printf в строке. Кроме того, интерполятор строк - это всего лишь специальный метод, и его можно определить самостоятельно. Например, некоторые библиотеки баз данных определяют очень мощный интерполятор sql.

Многострочные строки

Многострочные строки создаются путем включения строки в три двойные кавычки:

val quote = """The essence of Scala:
               Fusion of functional and object-oriented
               programming in a typed setting."""

Дополнительные сведения о строковых интерполяторах и многострочных строках см. в главе “Первое знакомство с типами”.

Contributors to this page: