缓存隐式解析



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

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

有没有更优雅的方法来实现隐式分辨率缓存?

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

需要注意的是有一些局限性,您可能不想对这个单一方法进行新的依赖,但实现非常简洁,至少是一个很好的起点。

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

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

相关内容

  • 没有找到相关文章

最新更新