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