如何使用隐式调用返回的函数而不分配给val

问题描述

假设我有一个像这样的对象:

object MyObj {
  def apply(args: List[String])(implicit v: Int): Unit => Int = (_: Unit) => args.length + v
}

如果要MyObj.apply,我必须这样做:

implicit val v = 5
val myObj = MyObj(List("a","b","c"))
myObj()

但这感觉多余。我想做的是:

implicit val v = 5
MyObj(List("a","c"))()

不幸的是,这似乎不起作用。系统抱怨说我缺少我的隐式参数,这是有道理的,但实在令人讨厌。

有什么方法可以直接调用从apply方法返回的函数,而无需先将其分配给值?

解决方法

这是scala 2.XX中的一个已知问题,已通过dotty修复。

请参阅此票证的第三点:

将显式参数传递给隐式参数的方式类似于普通应用程序。这个 与应用方法的省略相冲突。例如,如果您有

def f(隐式x:C):A => B 然后f(a)会将参数a传递给隐式参数,并且必须写 f.apply(a)将f应用于常规参数。

https://github.com/lampepfl/dotty/issues/1260

,

要么写

MyObj(List("a","b","c")).apply()

MyObj(List("a","c"))(implicitly)()

顺便说一下,接受Unit有点奇怪,通常返回Unit。也许

object MyObj {
  def apply(args: List[String])(implicit v: Int): () => Int = () => args.length + v
}

看起来更传统(我想以Int为例,否则也不建议使用Int之类的标准类型的隐式对象。)


在Dotty中

object MyObj {
  def apply(args: List[String])(using v: Int): Unit => Int = (_: Unit) => args.length + v
}

given Int = 5

MyObj(List("a","c"))(()) // 8

https://scastie.scala-lang.org/tpGE0JkWT3SuQ4ri0W9dNQ

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...