我再次对 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
}
它解析并做我想要的。为什么第一个语法不被接受?
最佳答案
是的,它是一种表达方式。但是,并非所有表达式都是平等的;根据Scala Language Specification ,第6章,“表达式”,方法调用的接收者只能来自所有表达式(语法中的SimpleExpr
)的一个(句法)子集,并且match
表达式不在该子集中(例如,if
表达式也不在其中)。
因此,您需要在它们周围加上括号:
(service match {
case => ...
...
}).isDefined
This question还有一些答案。
(已编辑以包含一些评论。)
关于scala - Scala 的匹配是否是表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8617747/