Ключ к пониманию в Scala: if-else выражения - это просто - выражения , а не управляющие структуры. Следовательно,
if (x == 5) "equal to 5"
не означает
", если x равно пяти, а затем вернуть пять",
, вместо этого это означает что-то вроде
"если x равно пяти, тогда оцените это выражение как пять, в противном случае оцените как неизвестное значение."
Фактически мы могли бы написать
val v: Any = if (x == 5) "equal to 5"
Примечаниекак тип v
равен Any
, потому что мы не предоставили часть выражения else
, поэтому лучший компилятор может сделать вывод типа Any
. Предоставляя условие else, мы имеем
val v: String = if (x == 5) "equal to 5" else "not equal to 5"
, где мы видим, что v
теперь приятно набирается в String
по мере необходимости. Теперь в Scala, если мы поместим выражение как выражение last в блоке, тогда оно станет возвращаемым значением функции. Таким образом,
def temp(x: Int): String = {
if (x == 5)
"equal to 5"
"not equal to 5"
}
эквивалентно
def temp(x: Int): String = {
val v1: Any = if (x == 5) "equal to 5"
// do nothing with v1
val v2: String = "not equal to 5"
return v2
}
, где мы видим, что temp
всегда будет возвращать только v2
. Вместо этого мы должны написать просто
def temp(x: Int): String =
if (x == 5) "equal to 5" else "not equal to 5"
Мы могли бы сказать, что выражение if-else действует как традиционная управляющая структура, только когда оно является последним выражением в блоке.
Более формально,в условное выражение if (?1) ?2 else ?3
Тип условного выражения - слабая наименьшая верхняя граница типов ?2
и?3
if (?1) ?2
оценивается так, как если бы оно было if (?1) ?2 else ()
.
, где ()
значение имеет тип Unit
что объясняется здесь .