Что означает «рекурсивный метод <имя метода> нуждается в типе» в Scala? - PullRequest
5 голосов
/ 01 сентября 2010

Когда я пытаюсь опустить точки в вызовах методов, как в этом примере программы:

object Test extends Application {
  val baz = new Baz
  var foo = baz bar
  println(foo)
}

class Baz {
  def bar = "bar"
}

Я получаю странные ошибки.Первый - error: recursive method foo needs type: println foo, а другой - error: type mismatch; found: Unit, required: Int, println(foo).Первая ошибка каким-то странным образом исправлена, если указать, что тип foo должен быть String.Второй не пройдет, пока я не поставлю точку между baz и bar.Какова причина этого?Почему Scala считает, что baz bar является рекурсивным методом?

1 Ответ

7 голосов
/ 01 сентября 2010

Проблема, которую вы видите, состоит в том, что если вы пропустите точки, код будет неоднозначным. Компилятор будет обрабатывать выражение как

var foo = baz.bar(println(foo))

, таким образом, foo определяется рекурсивно, а для метода StringOps.apply требуется аргумент Int (String будет неявно преобразован в StringOps, поскольку String не имеет apply метода).

Вы должны использовать оператор как синтаксис только при вызове методов, которые принимают один не Unit аргумент, чтобы избежать таких неоднозначностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...