Scala使用()应用PartialFunction与.apply()不同
我正试图在一个项目(Play Framework 2.4)中重构scala代码,当时我想到了以下想法: (为了提供一个简单的工作示例,我更改了一些类,例如,我分别使用Int和Option[Int]更改了Result和Future[Result]) 上面的代码可以编译 然后我想:我应该将fold[T]参数化类型限制为Int和Option[Int],所以我添加了:Scala使用()应用PartialFunction与.apply()不同,scala,compiler-errors,partialfunction,Scala,Compiler Errors,Partialfunction,我正试图在一个项目(Play Framework 2.4)中重构scala代码,当时我想到了以下想法: (为了提供一个简单的工作示例,我更改了一些类,例如,我分别使用Int和Option[Int]更改了Result和Future[Result]) 上面的代码可以编译 然后我想:我应该将fold[T]参数化类型限制为Int和Option[Int],所以我添加了: object ParFuncApply { trait CanBeAuthenticatedRequest[A] trait
object ParFuncApply {
trait CanBeAuthenticatedRequest[A]
trait AuthenticatedRequest[A] extends CanBeAuthenticatedRequest[A]
trait UnauthenticatedRequest[A] extends CanBeAuthenticatedRequest[A]
sealed trait Helper[T]
object Helper {
implicit object FutureResultHelper extends Helper[Option[Int]]
implicit object ResultHelper extends Helper[Int]
}
private def fold[T: Helper](authenticated: (AuthenticatedRequest[_]) => T)
(unauthenticated: (UnauthenticatedRequest[_]) => T):
PartialFunction[CanBeAuthenticatedRequest[_], T] = {
case ar: AuthenticatedRequest[_] => authenticated(ar)
case ur: UnauthenticatedRequest[_] => unauthenticated(ur)
}
def apply(request: CanBeAuthenticatedRequest[_])
(authenticated: (AuthenticatedRequest[_]) => Int)
(unauthenticated: (UnauthenticatedRequest[_]) => Int): Int = {
fold(authenticated)(unauthenticated)(request)
}
def async(request: CanBeAuthenticatedRequest[_])
(authenticated: (AuthenticatedRequest[_]) => Option[Int])
(unauthenticated: (UnauthenticatedRequest[_]) => Option[Int]): Option[Int] = {
fold(authenticated)(unauthenticated)(request)
}
}
但如果我更改以下内容,则此代码不再编译:
fold(authenticated)(unauthenticated)(request)
到fold(authenticated)(unauthenticated)。apply(request)
(我为apply()添加了一个显式调用)它编译。为什么会这样?对类调用()和.apply()应该是一样的,不是吗
编译器似乎要求将返回类型(Int或选项[Int])传递给PartialFunction,而不是CanBeAuthenticatedRequest类型。因为您在“fold[T:Helper]”中定义了上下文绑定,编译器将添加另一个参数列表。换言之,上下文绑定只是以下方面的语法糖:
private def fold[T](authenticated: (AuthenticatedRequest[_]) => T)
(unauthenticated: (UnauthenticatedRequest[_]) => T)
(implicit helper: Helper[T): PartialFunction[CanBeAuthenticatedRequest[_], T]
所以当你打电话的时候
fold(authenticated)(unauthenticated)(request)
编译器认为
request
应该是一个显式指定的隐式Helper[T]。@vicaba另外,与调用apply
不同,另一个常见的解决方法是在调用val之前先将部分函数分配给val。例如val f=fold(已验证)(未验证)
f(请求)
fold(authenticated)(unauthenticated)(request)