我正在尝试获得一个函数来编译/在scala中工作,并获得几个绝对无聊的错误消息,我无法理解.如果我写这样的代码:
def checkUniqueReviewNumber(number: String): Boolean = {
val qc = new QualityClient
if(review.isEmpty)
false
else {
val qrList = qc.listInPL(Vars.currentPLId.get.get,null,null,null,null,null,null,false,false,CurrentUser.getUser.key).qualityReviews
!qrList.exists(qr:QualityReview => qr.reviewNumber == number)
}
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
.../QualityReviewCreate.scala:189: error: not found: type ==
[scalac] !qrList.exists(qr:QualityReview => qr.reviewNumber == number)
Run Code Online (Sandbox Code Playgroud)
如果我写代码更像这样:
def checkUniqueReviewNumber(number: String): Boolean = {
val qc = new QualityClient
if(review.isEmpty)
false
else {
val qrList = qc.listInPL(Vars.currentPLId.get.get,null,null,null,null,null,null,false,false,CurrentUser.getUser.key).qualityReviews
!qrList.exists(qr:QualityReview => qr.reviewNumber.equals(number))
}
}
Run Code Online (Sandbox Code Playgroud)
我得到错误:
... /QualityReviewCreate.scala:189: error: ')' expected but '(' found.
[scalac] !qrList.exists(qr:QualityReview => qr.reviewNumber.equals(number))
[scalac] ^
... /QualityReviewCreate.scala:189: error: ';' expected but ')' found.
[scalac] !qrList.exists(qr:QualityReview => qr.reviewNumber.equals(number))
[scalac] ^
[scalac] two errors found
Run Code Online (Sandbox Code Playgroud)
所涉及的类型可能在这里有所贡献,但如果是这样的话,我完全会对原因感到困惑.qrList应该是QualityReview的java ArrayList,它是一个带有名为reviewNumber的java String字段的java对象.
有谁知道这里发生了什么?
Dan*_*wak 22
问题是Scala使用显式参数类型解析匿名函数是不明确的,有时会导致一些非常奇怪的怪癖.这是其中之一.采用以下表达式:
(qr:QualityReview => qr.reviewNumber == number)
Run Code Online (Sandbox Code Playgroud)
Scala(显然)解析如下:
(qr:(QualityReview => qr.reviewNumber == number))
Run Code Online (Sandbox Code Playgroud)
这不是你想要的.事实上,它甚至不是一个匿名函数.Desugaring表达式产生以下结果:
(qr: Function1[QualityReview, ==[qr.reviewNumber, number]])
Run Code Online (Sandbox Code Playgroud)
换句话说,我们将一个类型归于qr
,其中该类型由Function1
参数化给出,QualityReview
并且==
由类型qr.reviewNumber
和参数化给出的类型number
.所有这些都是有效的Scala,我怀疑它不是你想要的.
当Scala寻找具有名称的类型时会出现错误==
,当然它找不到(它可能存在,但它不存在).如果它已经超过了那个错误,那么很快就会遇到寻找类型qr.reviewNumber
和问题的问题number
.
有几种方法可以避免这个问题.一般来说,我只是建议在声明你的功能时使用略有不同的风格.在斯卡拉风格指南是一个良好的开端.在此函数的情况下,解决问题的最简单方法是删除类型注释(QualityReview
).您也可以通过括号括起来解决问题qr:QualityReview
.此外,我认为冒号之后的空格可能会解决问题,但我无法确定.最后,使用花括号而不是括号通常会使编译器更喜欢将解释=>
为lambda分隔符而不是类型.我会用exists
以下方式编写你的表达式:
!(qrList exists { qr => qr.reviewNumber == number })
Run Code Online (Sandbox Code Playgroud)
实际上,我可能会使用下划线语法,但这是一个完全不同的问题.:-)
!(qrList exists { _.reviewNumber == number })
Run Code Online (Sandbox Code Playgroud)
小智 8
简而言之,您只需在参数列表周围添加括号; 即
!qrList.exists((qr:QualityReview) => qr.reviewNumber == number)
Run Code Online (Sandbox Code Playgroud)
同样适用于.equals的第二次尝试
这是函数糖的一个很好的概述 http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html#funcdef
归档时间: |
|
查看次数: |
478 次 |
最近记录: |