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(),除非一切都很正常,
。。。