为了减少项目的编译时间,我缓存了通过隐式查找解析的某些类型类。但这看起来有点麻烦,因为直接的实现不起作用:
scala> implicit val x: String = implicitly[String]
x: String = null
隐式查找将其自己的未初始化定义视为有效实现。 Alazy 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
有没有更优雅的方式来实现隐式解析缓存?
无形的 https://github.com/milessabin/shapeless提供了一个cachedImplicit
宏与一个实现 https://github.com/milessabin/shapeless/blob/shapeless-2.2.5/core/src/main/scala/shapeless/package.scala#L126这与你的非常相似(它使用阴影来避免递归,并且它是一个宏这一事实意味着用法可以更干净)。
有一些限制 https://github.com/milessabin/shapeless/issues/508要注意的是,您可能不想为这个单一方法建立新的依赖关系,但实现非常简洁,并且它至少是一个很好的起点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)