Программирование на языке Scala/Блоки выражении

Выражения можно соединять в одно итоговое выражение. Это мы рассматривали на прошлых занятиях.

Из выражений можно получать значения. Пример:

val expression = 1 + 1

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

{
    val expression1 = 1 + 1
    val expression2 = 2 + 2
    expression1 * expression2
}

В данном примере в блоке обозначенным фигурными скобками, были объявлены два значения с названными expression1 и expression2. Далее было создано новое выражение. Все эти значения и выражение находятся внутри блока и не доступны для использования вне блока. Т.е. если написать следующий код, то он выдаст ошибку.

{
    val expression1 = 1 + 1
    val expression2 = 2 + 2
    expression1 * expression2
}
expression2 + 2

Так как expression2 определено только внутри блока, снаружи оно не видно. Таким образом блок выражении изолирует внутренние выражения и значения от доступа к ним извне блока. Все что объявлено внутри блока остается внутри блока. Если объявить такое же название вне блока, то это можно сделать и оно не будет конфликтовать с внутренним названием.

{
    val expression1 = 1 + 1
    val expression2 = 2 + 2
    expression1 * expression2
}
val expression2 = 3 + 3
val res = expression2 + 2

Ошибки нет. Значение res будет равно 8.

Блок выражений сам является выражением, так как может вычисляться в значение.

val expression3: Int = {
    val expression1 = 1 + 1
    val expression2 = 2 + 2
    expression1 * expression2
}

val res = 2 + expression3

Значением блока является значение последнего выражения блока. В данном случае это выражение expression1 * expression2, которое имеет значение 8. В итоге res имеет значение 10.

Все определения в Scala также являются выражениями, так как вычисляются в значение пустое множество () типа Unit. Таким образом определения можно использовать в любых местах кода не нарушая функциональную парадигму.

И если в блоке последним выражением стоит определение, то и значением блока соотвественно будет пустое множество. Скорее всего это логическая ошибка!

val expression3: Unit = {
    val expression1 = 1 + 1
    val expression2 = 2 + 2
    // возможно нужно указать значение expression2 в конце блока 
}

Все выражения и определения снаружи блока видны внутри блока.

val expression4 = 4 + 4
val expression3: Int = {
    val expression1 = 1 + 1
    val expression2 = 2 + 2
    expression1 * expression2 * expression4
}

val expression2 = 3 + 3
expression2 + expression3

Нет ошибок. Выражение expression4 виден внутри блока expression3.

Количество вложенностей блоков выражений друг в друга неограниченно.

val expression5: Int = {
    val expression4: Int = {
        val expression3: Int = {
            val expression1 = 1 + 1
            val expression2 = 2 + 2
            expression1 * expression2
        }
        expression3 + 1
    }
    expression4 + 2
}
expression5 + 3


Домашнее задание: править

  1. В учебном проекте создать файл ExpressionBlock.sc (Scala-Worksheet)
  2. Найти ошибку и вычислить значение выражения:
{
    val expression2 = 3 + 3
    val expression = {
      val expression1 = 1 + expression2
    }
    expression * expression2 + 4
    val expression3 = {
      val expression2 = 4 + 4
      1 + expression2
    }
    expression3 + expression2
}
  1. Составить три произвольных блока выражений, используя типы: Int, String, Boolean, и вычислить их значения