Scala 缓存隐式解析

Scala 缓存隐式解析,scala,scala-implicits,Scala,Scala Implicits,为了减少项目的编译时间,我正在缓存通过隐式查找解析的某些类型类。但这似乎有点麻烦,因为直接的实现不起作用: scala> implicit val x: String = implicitly[String] x: String = null 隐式查找将其自己的未初始化定义视为有效实现。一个lazy val将以无限递归的方式破坏堆栈。因此,我目前正在以这种方式处理它: implicit val x: String = cache.x object cache { val x: S

为了减少项目的编译时间,我正在缓存通过隐式查找解析的某些类型类。但这似乎有点麻烦,因为直接的实现不起作用:

scala> implicit val x: String = implicitly[String]
x: String = null
隐式查找将其自己的未初始化定义视为有效实现。一个
lazy val
将以无限递归的方式破坏堆栈。因此,我目前正在以这种方式处理它:

implicit val x: String = cache.x

object cache {
   val x: String = implicitly[String]
}
但这使得它过于复杂,缓存定义不能轻松地使用其他缓存类型类(因为它们不是隐式的)

此外,从作用域中隐藏值本身也很不幸不起作用

scala> :pas
// Entering paste mode (ctrl-D to finish)

object scope {
    implicit val x: String = {
        import scope.{ x => _ }
        implicitly[String]
    }
}

// Exiting paste mode, now interpreting.

defined object scope

scala> scope.x
res0: String = null
有没有更优雅的方法来实现隐式解析缓存?

提供了一个与您的非常类似的
cachedImplicit
宏(它使用阴影来避免递归,而它是一个宏这一事实意味着它的使用可以更干净)


需要注意的是,您可能不想对这个单一方法采用新的依赖关系,但实现非常简洁,至少是一个很好的起点。

为了完整性起见:接受答案中的不成形宏以我没有想到的方式隐藏了它自己的定义。因此,我的特殊问题可以通过以下方式解决:

implicit val x: String = {
    def x = ???
    implicitly[String]
}

@Taig你看过Shapeless的
cachedImplicit
宏了吗?“这和你在做什么有关。”特拉维斯布朗说,这正是我一直在寻找(并暗暗希望)的东西。我在谷歌查询时没有遇到它。如果你把你的评论变成一个答案,我很乐意接受。