Scala的匹配是否与表达相符?

时间:2011-12-23 15:32:03

标签: scala syntax

我再次对Scala的语法感到困惑。我希望这个工作得很好:

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

注意findUuidByTweetIdfindUuidByServiceId都返回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 个答案:

答案 0 :(得分:10)

是的,这是一个表达方式。但是,并非所有表达都是平等的;根据{{​​3}},第6章“表达式”,方法调用的接收者只能来自所有表达式的(语法)子集(语法中为SimpleExpr),{{1}表达式不在该子集中(例如,match表达式都不是。)

因此,您需要在它们周围加上括号:

if

Scala Language Specification有更多答案。

(编辑纳入一些评论。)