Подтвердить что ты не робот

Тип возврата в выражении If

Я изучаю scala и не могу понять, почему:

def signum(arg: Int) = {
    if(arg > 0 ) 1
    else if(arg < 0) -1
    else 0
}

Имеет Int как возвращаемый тип signum (arg: Int): Int

Но

def signum(arg: Int) = {
    if(arg > 0 ) 1
    else if(arg < 0) -1
    else if(arg == 0) 0
}

Имеет AnyVal signum (arg: Int): AnyVal

4b9b3361

Ответ 1

В отсутствие явного else, Scala предполагает следующее:

else ()

Где () - значение Unit. Это значение, возвращаемое println или присваиванием var, например.

Это легко проверить:

scala> val x = if (false) 1
x: AnyVal = ()

scala> x.isInstanceOf[Unit]
res3: Boolean = true

Ответ 2

Это происходит потому, что во втором случае вы не указали окончательную часть else. В этом случае тип возврата этой пропавшей ветки будет Unit. Поэтому Scala компилятор выводит AnyVal как общий родительский элемент Int и Unit.

вы можете попытаться добавить явный тип возвращаемого значения в подпись функции:

def signum(arg: Int): Int = ...

Он не будет компилироваться со следующей ошибкой:

 found   : Unit
 required: Int
    else if(arg == 0) 0
         ^
one error found

Итак, компилятор сообщает вам, что тип результата последнего if на самом деле Unit, а не Int.