缓存隐式解析
Caching implicit resolution
为了减少我的项目的编译时间,我缓存了通过隐式查找解析的特定类型 类。但这看起来有些麻烦,因为直接的实现不起作用:
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 provides a cachedImplicit
macro with an implementation 这与你的非常相似(它使用阴影来避免递归,而且它是一个宏这一事实意味着用法可以更简洁)。
有 some limitations 需要注意,您可能不想为这个单一方法承担新的依赖关系,但实现非常简洁,至少是一个很好的起点。
只是为了完整性:接受的答案中的无形宏以我没有想到的方式隐藏了它自己的定义。因此,我的特殊问题可以这样解决:
implicit val x: String = {
def x = ???
implicitly[String]
}
为了减少我的项目的编译时间,我缓存了通过隐式查找解析的特定类型 类。但这看起来有些麻烦,因为直接的实现不起作用:
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 provides a cachedImplicit
macro with an implementation 这与你的非常相似(它使用阴影来避免递归,而且它是一个宏这一事实意味着用法可以更简洁)。
有 some limitations 需要注意,您可能不想为这个单一方法承担新的依赖关系,但实现非常简洁,至少是一个很好的起点。
只是为了完整性:接受的答案中的无形宏以我没有想到的方式隐藏了它自己的定义。因此,我的特殊问题可以这样解决:
implicit val x: String = {
def x = ???
implicitly[String]
}