С нуля до распределенных приложений.
Много интересных вещей в Scala можно быстро проверять в REPL (read-eval-print-loop) консоли, которая может быть вызвана командой sbt console (в вашем проекте) или scala:
$ scala
scala> 1
res0: Int = 1
Переменные создаются ключевым словом var, их значения можно менять.
scala> var x: Int = 5
x: Int = 5
scala> x + 10
res2: Int = 15
scala> x = 15
x: Int = 15
scala> x + 10
res3: Int = 25
В Scala, как и в других функциональных языках, принято минимизировать количество побочных эффектов (side effects), одним из которых является работа с переменными. Вместо них используются неизменяемые значения (immutable values).
scala> val x: Int = 5
x: Int = 5
scala> x + 10
res4: Int = 15
scala> x = 15
<console>:8: error: reassignment to val
x = 15
^
scala> x + 10
res5: Int = 15
Использование неизменяемых значений вместо переменных облегчает читаемость, тестируемость и параллелизацию программ.
Важно понимать, что в Scala нет деления на выражения возвращающие значения и действия, как в других императивных языках программирования.
Пример выражения и действия в C#:
// действие
int x;
if (y > 10)
{
x = -1
}
else
{
x = 1
}
// выражение
int x = (y > 10) ? -1 : 1;
Благодаря этому возможны конструкции непривычные в C#:
val x: Int = if (y > 10) -1 else 1
val z: Int = try {
// load from file, return line count
nLines
} catch {
case _ => 0
}
Но как же выражения которые не возвращают значений?
Аналогом ключевого слова void из других языков в Scala является тип Unit единственным значением которого является ().
scala> val p = println("hello")
hello
p: Unit = ()
scala> var x: Int = 5
x: Int = 5
scala> x += 5
scala> val y = x += 5
y: Unit = ()
Любое выражение в Scala может быть заменено блоком из нескольких выражений обернутым {}. Значением блока будет последнее значение в нем.
val x = 5
val y = {
val z = x + 5 // переменная не видна снаружи блока
z - 3
}
// здесь y = 7
TODO