Рассмотрим следующий фрагмент кода:
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
^
Мой вопрос: можно ли сделать неявный параметр доступным для тела функции вызова по имени?
EDIT Я попытался заставить его работать с реализацией макроса, как предложил Алексей Романов
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
?
todo(parameter)
, но в этом случае весь смысл имплицита пропадает. Мой вопрос был больше о том, почему неявное определение, определенное вrun
, не туннелируется в тело запуска вызывающей стороны. - person llirik   schedule 20.09.2015