考虑以下代码片段:
object Example {
def run(f: => Unit): Unit = {
implicit val i = 1
f
}
def caller(): Unit =
run {
todo
}
def todo(implicit i: Int): Unit =
println(i)
}
当前未编译并显示以下消息:
Error:(14, 13) could not find implicit value for parameter i: Int
todo
^
我的问题是可以使隐式参数可用于按名称调用的函数体吗?
编辑我尝试按照Alexey Romanov 的建议使其与宏实现一起使用
import scala.language.experimental.macros
import scala.reflect.macros.whitebox.Context
object Macros {
def run(f: => Unit): Unit = macro runImpl
def runImpl(c : Context)(f: c.Tree) = {
import c.universe._
q"""{
implicit val i: Int = 3
$f
}"""
}
}
object Example extends App {
Macros.run {
todo
}
def todo(implicit i: Int): Unit =
println(i)
}
调试宏我可以看到它已正确扩展为
{
implicit val i: Int = 3
Example.this.todo
}
不幸的是,它不能编译以及与未找到隐式相同的错误。
深入研究问题,我在这里找到了讨论和 jira 问题https://issues.scala-lang.org/browse/SI-5774
所以问题是一样的:todo
在这种情况下是否有可能将隐式隧道转换为函数?