Тип возврата в выражении If - PullRequest
18 голосов
/ 07 февраля 2012

Я изучаю 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

Ответы [ 2 ]

24 голосов
/ 07 февраля 2012

Это происходит потому, что во втором случае вы не указали окончательную 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.

21 голосов
/ 07 февраля 2012

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

else ()

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

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

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

scala> x.isInstanceOf[Unit]
res3: Boolean = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...