В этом разделе представлен обзор переменных и типов данных 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:
Contents
- Введение
- Возможности Scala
- Почему Scala 3?
- Почувствуй Scala
- Пример 'Hello, World!'
- REPL
- Переменные и типы данных
- Структуры управления
- Моделирование данных
- Методы
- Функции первого класса
- Одноэлементные объекты
- Коллекции
- Контекстные абстракции
- Верхнеуровневые определения
- Обзор
- Первый взгляд на типы
- Интерполяция строк
- Структуры управления
- Моделирование предметной области
- Инструменты
- Моделирование ООП
- Моделирование ФП
- Методы
- Особенности методов
- Main методы в Scala 3
- Обзор
- Функции
- Анонимные функции
- Параметры функции
- Eta расширение
- Функции высшего порядка
- Собственный map
- Создание метода, возвращающего функцию
- Обзор
- Пакеты и импорт
- Коллекции в Scala
- Типы коллекций
- Методы в коллекциях
- Обзор
- Функциональное программирование
- Что такое функциональное программирование?
- Неизменяемые значения
- Чистые функции
- Функции — это значения
- Функциональная обработка ошибок
- Обзор
- Типы и система типов
- Определение типов
- Параметризованные типы
- Пересечение типов
- Объединение типов
- Алгебраические типы данных
- Вариантность
- Непрозрачные типы
- Структурные типы
- Зависимые типы функций
- Другие типы
- Контекстные абстракции
- Методы расширения
- Параметры контекста
- Контекстные границы
- Given импорты
- Классы типов
- Многостороннее равенство
- Неявное преобразование типов
- Обзор
- Параллелизм
- Scala утилиты
- Сборка и тестирование проектов Scala с помощью Sbt
- Рабочие листы
- Взаимодействие с Java