Соответствие Скалы выражению или нет? - PullRequest
3 голосов
/ 23 декабря 2011

Я снова запутался в синтаксисе Scala.Я ожидал, что это будет работать нормально:

// VERSION 1
def isInteractionKnown(service: Service, serviceId: String) = service match {
    case TwitterService =>
        twitterInteractions.findUuidByTweetId(serviceId.toLong)
    case FacebookService =>
        facebookInteractions.findUuidByServiceId(serviceId)
}.isDefined

ПРИМЕЧАНИЕ : оба значения findUuidByTweetId и findUuidByServiceId возвращают Option[UUID]

scalac и говорит мне:

error: ';' expected but '.' found.
}.isDefined

Когда я позволяю своей IDE (IDEA) переформатировать код, часть .isDefined заканчивается на собственной строке.Это как если бы match не было выражением.Но, на мой взгляд, то, что я сделал, было функционально эквивалентно:

// VERSION 2
def isInteractionKnown(service: Service, serviceId: String) = {
    val a = service match {
        case TwitterService =>
            twitterInteractions.findUuidByTweetId(serviceId.toLong)
        case FacebookService =>
            facebookInteractions.findUuidByServiceId(serviceId)
    }

    a.isDefined
}

, который анализирует и делает именно то, что я хочу.Почему первый синтаксис не принят?

1 Ответ

10 голосов
/ 23 декабря 2011

Да, это выражение. Не все выражения одинаковы; согласно Спецификации языка Scala , Глава 6, «Выражения», получатель вызова метода может исходить только из (синтаксического) подмножества всех выражений (SimpleExpr в грамматике) и match выражения не входят в это подмножество (например, не if выражения).

В результате вам нужно заключить в них скобки:

(service match {
  case => ...
  ...
}).isDefined

На этот вопрос есть еще несколько ответов.

(отредактировано для включения некоторых комментариев.)

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