【发布时间】:2015-12-21 15:38:00
【问题描述】:
为了减少我的项目的编译时间,我正在缓存通过隐式查找解析的某些类型类。不过这看起来有些麻烦,因为直接的实现不起作用:
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
有没有更优雅的方式来实现隐式分辨率缓存?
【问题讨论】:
-
@Taig 你看过Shapeless 的
cachedImplicit宏吗? very similar 你正在做的事情。 -
@TravisBrown 这正是我一直在寻找(并暗中希望)的。我的谷歌查询没有遇到它。如果你把你的评论变成一个答案,我很乐意接受。
标签: scala scala-implicits