Вывод типа на методе возвращает тип

Почему Scala не удается вывести тип возврата метода, когда существует явное return оператор используется в методе?

Например, почему следующее кодирует компиляцию?

object Main {
    def who = 5
    def main(args: Array[String]) = println(who)
}

Но следующее не делает.

object Main {
    def who = return 5
    def main(args: Array[String]) = println(who)
}
28
задан Peter Mortensen 29 April 2013 в 18:51
поделиться

3 ответа

Тип возврата метода - это либо тип последнего оператора в блоке, который его определяет, либо тип выражения, которое его определяет, при отсутствии блока.

Когда вы используете return внутри метода, вы вводите другой оператор, из которого метод может возвращаться. Это означает, что Scala не может определить тип этого return в точке, где он был найден. Вместо этого он должен продолжаться до конца метода, затем объединить все точки выхода, чтобы определить их типы, а затем вернуться к каждой из этих точек выхода и назначить их типы.

Это увеличило бы сложность компилятора и замедлило бы его, с той единственной выгодой, что не нужно было указывать тип возвращаемого значения при использовании return . В настоящей системе, с другой стороны, вывод возвращаемого типа происходит бесплатно из ограниченного вывода типа, который уже используется в Scala.

Итак, в конце концов, в балансе между сложностью компилятора и ожидаемыми выгодами последнее не стоит первого.

30
ответ дан 28 November 2019 в 03:32
поделиться

Не знаю почему. Возможно, просто чтобы воспрепятствовать использованию оператора return . :)

-2
ответ дан 28 November 2019 в 03:32
поделиться

Учитывая это (2.8.Beta1):

object Main {
  def who = return 5
  def main(args: Array[String]) = println(who)
}
<console>:5: error: method who has return statement; needs result type
         def who = return 5

... похоже, это не случайно.

1
ответ дан 28 November 2019 в 03:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: