超类范围中的隐含参数

时间:2016-03-15 13:37:59

标签: scala implicit-conversion superclass

在我目前的项目中,我们有一个特征如下的特征:

trait MyTrait {
  def foo(bar: Request => IntermediateResult): Result = {
    val request: Request = ???
    bar(request).toResult(request)
  }
}

但在某些情况下,我们需要直接返回Result的实例。所以我想我可以简单地更改foo方法的签名以获取类型为Request => Result的函数参数,并提供从Request => IntermediateResult函数到Request => Result的隐式转换:< / p>

implicit def intermediateResult2Result(handle: Request => IntermediateResult)(implicit request: Request) =
  handle.andThen(_.toResult(request))

但是,这要求request实例隐式可用。所以我的想法是将foo重写为:

def foo(bar: Request => Result): Result = {
  implicit val request: Request = ???
  bar(request)
}

但是,现在对foo的调用现在应该包含implicit request参数,而不仅仅是普通request。有没有办法解决这个限制?

2 个答案:

答案 0 :(得分:0)

你不需要这么复杂。只需添加另一种foo

def foo(bar: Request => IntermediateResult) = bar(request).toResult
def fooBar(bar: Request => Result) = bar(request)

答案 1 :(得分:0)

如果您以稍微不同的方式制定隐式转换,则不再需要隐式参数:

implicit def intermediateResult2Result(handle: Request => IntermediateResult): Request => Result =
  {request: Request => handle(request).toResult(request)}