更快
阅读了许多文章后,我仍然对Scala无形库感到有些困惑。似乎无形使用Scala编译功能?那么它是否使用反射,并且对生产代码安全吗?
无形不使用反射,它使用宏来检查类的结构。通过无形,此检查在编译时进行,而不是运行时发生(反射在运行时发生(。由于这种无形,可以认为比反射更安全,因为它可以在编译时进行许多检查。
让我们尝试使用无形的
来获取字段case class MyClass(field: String)
import shapeless._
val myClassLens = lens[MyClass] >> 'field
val res = myClassLens.get(MyClass("value")) // res == "value"
如果我们使用无效字段名称,则编译器将对编译错误抱怨
另一方面,如果我们尝试使用反射来实现同样的事情,则将在运行时(也许在生产中(检查字段名称,这就是为什么反射不像无形的那样安全的原因。与反射相比,它的速度也将比反射