Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 超类作用域中的隐式参数_Scala_Implicit Conversion_Superclass - Fatal编程技术网

Scala 超类作用域中的隐式参数

Scala 超类作用域中的隐式参数,scala,implicit-conversion,superclass,Scala,Implicit Conversion,Superclass,在我当前的项目中,我们有一个方法的特点,如: trait MyTrait { def foo(bar: Request => IntermediateResult): Result = { val request: Request = ??? bar(request).toResult(request) } } 但在某些情况下,我们需要直接返回Result的实例。因此,我认为我可以简单地更改foo方法的签名,以获取类型为Request=>Result的函数参数,并

在我当前的项目中,我们有一个方法的特点,如:

trait MyTrait {
  def foo(bar: Request => IntermediateResult): Result = {
    val request: Request = ???
    bar(request).toResult(request)
  }
}
但在某些情况下,我们需要直接返回
Result
的实例。因此,我认为我可以简单地更改
foo
方法的签名,以获取类型为
Request=>Result
的函数参数,并提供从
Request=>IntermediateResult
函数到
Request=>Result
的隐式转换:

implicit def intermediateResult2Result(handle: Request => IntermediateResult)(implicit request: Request) =
  handle.andThen(_.toResult(request))
但是,这要求
请求
实例隐式可用。因此,我的想法是将
foo
改写为:

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

但是,现在对
foo
的调用应该包括
隐式请求
参数,而不仅仅是一个普通的
请求
。有没有办法绕过这个限制?

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

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

如果隐式转换的公式稍有不同,则不再需要隐式参数:

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

不要使用隐式转换,以后您将省去很多麻烦。添加另一个方法确实可以解决问题,但这并不是很好:(我将在这里与我的团队的其他成员讨论。我认为,这实际上是更好的,然后隐式转换神奇地发生了。想象一下,你正在阅读一段代码,你以前从未见过,做一些类似于
“foo”。multiplyBy(15)。sendToServer()和crash(),除非一切都很正常,
。。。