scala - Scala 的匹配是否是表达式?

标签 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
}

它解析并做我想要的。为什么第一个语法不被接受?

最佳答案

是的,它是一种表达方式。但是,并非所有表达式都是平等的;根据Scala Language Specification ,第6章,“表达式”,方法调用的接收者只能来自所有表达式(语法中的SimpleExpr)的一个(句法)子集,并且match表达式不在该子集中(例如,if 表达式也不在其中)。

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

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

This question还有一些答案。

(已编辑以包含一些评论。)

关于scala - Scala 的匹配是否是表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8617747/

相关文章:

java - 使 scala.Long 具有可比性

"with"语句的 Python 无效语法

c# - Mono C# 编译器将完全有效的表达式解释为错误的类型参数

c++ - C++ switch 仅适用于整数类型的基本原理是什么?

scala - `F[Something[F]]` 背后的意图是什么?

scala - 遍历 cats/scalaz 中的字符串

java - sbt:导入 resteasy-client 时出错

scala - Play 2.1 中的私有(private) Assets

php echo 无需转义引号

mysql - 问号在 "WHERE column = ?"处的 MySQL 中有什么意义?