问题描述
假设我有一个像这样的对象:
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