我已经看到一些涉及臭名昭着的“22字段/参数”问题的其他问题,这是Scala V<的固有错误(特征?)。 2.11。请参阅here和here。但是,根据此blog post,case class
中的22参数限制似乎已得到修复;至少在语言方面。
我有一个case class
我希望加载一个任意值(读取:> 22),稍后将使用Play库将这些值读入JSON对象。
它看起来像这样:
object L {
import play.api.libs.json.Reads. _
import play.api.libs.functional.syntax._
implicit val responseRead: Reads[L] = (
MyField1.jsPath.Read[MyField1.t] and
MyField2.jsPath.Read[MyField2.t] and
...
MyField35.jsPath.Read[MyField35.t]
) (L.apply _)
}
case class L(myField1: MyField1.t, myField2: MyField2.t, ... myField35: MyField35.t)
问题是在编译时,Scala抱怨case class
中有超过22个参数。 (具体来说:在对象定义的最后一行,当编译器尝试构建时,我得到:“实现将函数限制为22个参数”。)我目前正在使用Scala v2.11.6,所以我想想这不是语言问题。这让我觉得Play库没有更新Read
的实现。
如果是这种情况,那么我猜最好的办法是将相关字段分组为元组并通过JSON API传递元组?
答案 0 :(得分:1)
正如您引用的博客文章中所提到的,22参数限制对Scala 2.11及更高版本中的函数仍然有效,因此您遇到的是语言问题。在这种情况下,函数调用是:
L.apply _
重构模型是解决此限制的一种方法。
答案 1 :(得分:0)
所以这个问题的答案实际上是两个部分:
我将其称为“解决方法”,因为虽然它“有效”但通常会解决症状,而不是问题。
我的解决方案是使用shapeless
来提供任意长度的通用异构列表。该解决方案已经在其他地方广泛讨论并可用。参见,例如,(1)[SO Post] How to get around the Scala case class limit of 22 fields?; (2)Blog post; (3)Yet another blog post。
正如@ jeffrey-chung提到的那样,重组模型来处理这个限制。正如业内许多人所指出的那样,拥有一个超过30个参数的函数可能表明你的函数做得太多,或者该函数应该被重构以摄取少量参数。参见,例如,(1)Rule of 30 – When is a method, class or subsystem too big?; (2)Databrick's style guide。
答案 2 :(得分:0)
在此处查看答案 https://stackoverflow.com/a/57317220/1606452
看来这一切都很好。
+22个用于case-json的现场案例类格式化程序及更多 https://github.com/xdotai/play-json-extensions
支持Scala 2.11.x,2.12.x和2.13.x并播放2.3、2.4、2.5和2.7
在play-json issue中被引用为首选解决方案(但尚未合并)