Пропуск точек при объединении вызовов - PullRequest
6 голосов
/ 28 января 2011

Я не понимаю, почему следующий код не компилируется:

class Abc 
{
    def b (x : String) = x + "abc"

    def a (y : String) =
    {
        val ls : List[String] = y.lines toList
        b (ls.head)
    }
}

Main.scala: 8: ошибка: несоответствие типов; найдено: java.lang.String требуется: Int b (ls.head)

Когда я изменяю «y.lines toList» на

y.lines.toList

или даже

y.lines toList;

он компилируется.

Возможно, компилятор понимает это как

(y.lines).toList(b (ls.head))

или что-то в этом роде, но я до сих пор не понимаю правила.

Ответы [ 2 ]

1 голос
/ 28 января 2011

Вы точно поняли это:

(y.lines).toList(b (ls.head))

Единственное возможное исправление:

(y.lines).toList(b).apply(ls.head)

Я не уверен, что Scala примет решение в данном конкретном случае.

Правило, грубо говоря, это object (method parameters)* [method].Компилятор продолжит работу, пока не найдет токены для допустимого выражения.A ; завершает выражение, как и ) или }.Если следующая строка пуста, выражение также заканчивается.Если следующая строка начинается с зарезервированного ключевого слова (val, def, if и т. Д.), Выражение также закончится.

1 голос
/ 28 января 2011

Это не очевидно, и это комбинация синтаксиса быстрого доступа Scala и индексации списка.Если вам нужна подсказка, попробуйте переопределить b на:

def b(x : String) = 0

. Вы получите еще один мусор компилятора, но ошибка изменится.Короче говоря, компилятор Scala позволит вам опустить парены и точки для методов с нулевым или однопараметрическим методом, и мы знаем, b похоже, что он каким-то образом связывается. Проблема в том, что Scala также использует парены для индексации списка, поэтому toList, который возвращает итератор, может принять один параметр в качестве индекса списка.Я не совсем уверен в этой части, но похоже, что, как только вы начнете пропускать точки, лексер станет жадным, и когда он встретит метод, который может принимать один параметр, попытается передать ему следующую инструкцию.В данном случае это строка, поэтому она выдает синтаксическую ошибку.

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