приоритет слова scala - PullRequest
       8

приоритет слова scala

3 голосов
/ 19 февраля 2011

как определяется "приоритет ключевых слов" в scala?

Рассмотрим этот кусок кода:

for(i <- 1 to 10) yield i

Это нормально, я получаю Seq от 1 до 10, но когда я пытаюсь соответствовать сразу после:

for(i <- 1 to 10) yield i match {case x => x.head}

Произошла ошибка компиляции: error: value head is not a member of Int.

Я могу заключить for ... yield в скобки, чтобы дать ему приоритет:

{for(i <- 1 to 10) yield i} match {case x => x.head}

Но мне все еще интересно, как интерпретируется второй пример кода. Я ожидаю, что и второй пример будет работать правильно, не окружая его паренами.

Может кто-нибудь объяснить мне или указать мне правильную главу в спецификации?

1 Ответ

4 голосов
/ 19 февраля 2011

Второй пример интерпретируется как:

for(i <- 1 to 10) yield { i match {case x => x.head} } // won't compile

Примерный синтаксис для для выглядит следующим образом:

for (Enumerators) yield Expr

Поскольку i match { case x => x.head } анализируется как действительныйвыражение (по лексемам), вот как это увидит компилятор.Так что, если Expr выглядит как выражение, оно будет обработано.Исходя из этого, следующие утверждения действительны:

for(i <- 1 to 10) yield for(j <- 1 to 2) yield (i, j)
for(i <- 1 to 10) yield if (i % 2 == 0) 'a' else 'b'
for(i <- 1 to 10) yield try { 1 / (i - 5) } catch { case _ => }

и все они эквивалентны

for(i <- 1 to 10) yield { for(j <- 1 to 2) yield (i, j) }
for(i <- 1 to 10) yield { if (i % 2 == 0) 'a' else 'b' }
for(i <- 1 to 10) yield { try { 1 / (i - 5) } catch { case _ => } }

Примечание: спецификация языка Scala доступна здесь (первая ссылка).Соответствующий раздел находится на странице 161 в главе A (Синтаксическая сводка Scala).

...