如何解决如何使用隐式调用返回的函数而不分配给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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。