斯卡拉二十二再次

时间:2017-06-09 03:32:49

标签: scala

Scala案例类目前可以有22个以上的属性,但AFAIA编译器不会编译apply / unapply方法。

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

注意

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

提前感谢您的回答。

1 个答案:

答案 0 :(得分:2)

是的,Scala支持版本>22 fields中的2.11。但是,存在一些限制 - 案例类将不再有unapplyunapplyseqtupled(您不再将案例类转换为元组)函数,因为scala仍然没有& #39; t支持更多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

因此,case类更像普通类类,许多其他库将无法完全利用此case类。比如,json序列化库。

当我尝试使用宏读/写将case类序列化为json时,我遇到了这个问题,并且在playframework项目中反之亦然,因为case类不再包含unapply()方法。解决此问题的方法是为案例类提供自定义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)
  

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

我假设您的情况相同,您正在使用reactivemongo宏来进行json到案例类序列化。

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

因此,我建议您使用自定义BSON阅读器和编写器作为案例类here