如何在不分配给 val 的情况下使用隐式调用返回的函数

Log*_*ter 2 scala implicit

假设我有一个对象,如:

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

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

implicit val v = 5
val myObj = MyObj(List("a", "b", "c"))
myObj()
Run Code Online (Sandbox Code Playgroud)

但这感觉是多余的。我希望能够做的是:

implicit val v = 5
MyObj(List("a", "b", "c"))()
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎不起作用。系统抱怨我遗漏了我隐含的论点,这是有道理的,但令人失望。

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

Pri*_*dam 6

这是 Scala 2.XX 中的一个已知问题,并已在 dotty 中修复。

参考这张票的第三点:

将显式参数传递给隐式参数就像普通应用程序一样编写。这与省略应用方法相冲突。例如,如果你有

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

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