当前位置:  开发笔记 > 编程语言 > 正文

缓存隐式解决方案

如何解决《缓存隐式解决方案》经验,为你挑选了1个好方法。

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

scala> implicit val x: String = implicitly[String]
x: String = null

隐式查找将其自己的未初始化定义视为有效实现.A 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

是否有更优雅的方法来实现隐式解析缓存?



1> Travis Brown..:

Shapeless提供了一个cachedImplicit宏,其实现与您的非常相似(它使用阴影来避免递归,并且它是一个宏意味着使用可以更清晰).

有一些限制需要注意的,你可能不希望采取这种单一的方法一个新的依赖,但执行是非常简洁,它的至少一个很好的起点.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有