斯卡拉二十二又来了

  • 本文关键字:来了 二十二 scala
  • 更新时间 :
  • 英文 :


Scala 案例类现在可以有 22+ 个属性,但 AFAIA 编译器不会编译 apply/unapply 方法。

有没有办法在编译时通过插件生成应用/取消应用,或者至少使用 IDE 等生成方法?

注意

  • 请不要开始问 - 你为什么需要这个?它用于使用Reactive Mongo从mongoDB映射现有JSON模式
  • 请不要建议将属性分组为较小的案例类等。 架构是由其他人创建的,并且已经存在于生产环境中。

提前感谢您的回答。

是的,Scala 支持版本2.11>22 fields。但是,存在某些限制 - 案例类将不再具有unapplyunapplyseqtupled(您将不再将案例类转换为元组)函数,因为 scala 仍然不支持超过 22 个值的元组。

val tup = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22) //will compile
val tup = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23) //will fail

因此,案例类更像是常规类类,许多其他库将无法充分利用此案例类。例如,json 序列化程序库。

当我尝试使用宏读/写将案例类序列化为 json 和 viceversa 时,我遇到了这个问题,在它不会编译的 playframework 项目中,因为案例类不再包含 unapply() 方法。解决此问题的一种方法是为 case 类提供自定义implicit read/writes,而不是使用宏。

case class Person(name: String, age: Int, lovesChocolate: Boolean)
implicit val personReads = Json.reads[Person] //this wond work, need to write custom read as below.
implicit val personReads = (
(__  'name).read[String] and
(__  'age).read[Int] and
(__  'lovesChocolate).read[Boolean]
)(Person)

请不要开始问 - 你为什么需要这个?用于映射 来自使用反应式Mongo的mongoDB的现有JSON模式

我假设你是同样的情况,你正在使用反应式mongo宏进行json到/来自案例类序列化。

implicit val personReader: BSONDocumentReader[Person] = Macros.reader[Person]
implicit val personWriter: BSONDocumentWriter[Person] = Macros.writer[Person]
//or Handler 
Macros.handler[Person]

因此,我建议您为案例类使用自定义 BSON 阅读器和编写器,如此处所述。

最新更新