22 des champs de limite dans Scala 2.11 + Play Framework 2.3 Cas des classes et des fonctions

Scala 2.11 est sorti et le 22 champs de limite pour les classes de cas semble être fixe (Scala Problème, Notes De Version).

Cela a été un problème pour moi parce que j'utilise des classes de cas de modèle de base de données des entités qui ont plus de 22 des champs dans le Jeu + Postgres Async. Ma solution à Scala 2.10 était de casser les modèles en plusieurs classes de cas, mais je trouve cette solution difficile à maintenir et à étendre, et j'espérais que je pourrais mettre en place quelque chose comme décrit ci-dessous après le passage à Jouer 2.3.0-RC1 + Scala 2.11.0:

package entities

case class MyDbEntity(
  id: String,
  field1: String,
  field2: Boolean,
  field3: String,
  field4: String,
  field5: String,
  field6: String,
  field7: String,
  field8: String,
  field9: String,
  field10: String,
  field11: String,
  field12: String,
  field13: String,
  field14: String,
  field15: String,
  field16: String,
  field17: String,
  field18: String,
  field19: String,
  field20: String,
  field21: String,
  field22: String,
  field23: String,
) 

object MyDbEntity {
  import play.api.libs.json.Json
  import play.api.data._
  import play.api.data.Forms._

  implicit val entityReads = Json.reads[MyDbEntity]
  implicit val entityWrites = Json.writes[MyDbEntity]
}

Le code ci-dessus ne peut pas compiler avec le message suivant pour le "Lit" et "Écrit":

No unapply function found

Mise à jour du "Lit" et "Écrit" à:

  implicit val entityReads: Reads[MyDbEntity] = (
    (__ \ "id").read[Long] and
    (__ \ "field_1").read[String]
    ........
  )(MyDbEntity.apply _)  

  implicit val postWrites: Writes[MyDbEntity] = (
    (__ \ "id").write[Long] and
    (__ \ "user").write[String]
    ........
  )(unlift(MyDbEntity.unapply))

Aussi ne fonctionne pas:

  implementation restricts functions to 22 parameters

  value unapply is not a member of object models.MyDbEntity

Ma compréhension est que la Scala 2.11 a encore quelques limitations sur les fonctions et que quelque chose comme ce que j'ai décrit ci-dessus n'est pas encore possible. Cela semble bizarre pour moi que je ne vois pas l'avantage de la levée des restrictions sur les classes de cas si c'est un des principaux utilisateurs des cas est toujours pas pris en charge, alors je me demandais si il me manque quelque chose.

Des pointeurs vers des questions ou des détails de mise en œuvre sont plus que bienvenus! Merci!

  • Jetez un oeil à pertinentes pull request description: la première chose que mentionné que la limitation est le manque de unapply pour >22 classes et cela a été fait pour une raison (AFAIR, il y aurait une exponentielle blowup dans classfiles taille)
  • Une classe de cas avec >22 params ne peut pas avoir unapply, car elle aurait à se convertir à une TupleX avec X>le 22, et les tuples sont toujours limités à 22. Le plus triste est que Json.format[MyCaseClass] (la macro-fonction de la solution) n'a pas besoin d'avoir cette limitation (il pourrait réaliser que c'est une affaire de classe et il suffit d'extraire les champs directement, sans l'annuler, comme le pattern matching), mais actuellement, il semble pour unapply et échoue...
  • Pour ceux que cela intéresse, voici un billet de suivi de la suppression de cette limitation: github.com/playframework/playframework/issues/3174
  • Le ticket est toujours ouvert. Est-il encore un problème avec >22 2.3 avec Scala 2.11.1? Effectuer des recherches sur des piles pour un nouveau projet & je me demandais si cela va être un problème. Thx
InformationsquelleAutor luis | 2014-05-09