Est-il possible d'avoir les tuples avec les nom des champs dans la Scala, semblable à un anonyme classes en C#?
Voir: Puis-je spécifier un nom significatif pour une classe anonyme en C#?
En C#, vous pouvez écrire:
var e = new { ID = 5, Name= "Prashant" };
assertEquals( 5, e.ID )
Mais en Scala j'arrive à la fin de l'écriture:
var e = (5, "Prashant")
assertEquals( 5, e._1 )
Scala maintient type de sécurité grâce à l'utilisation de médicaments génériques (comme C#), mais perd de la lisibilité du nom de chaque champ, e.g-je utiliser "_1" au lieu de "ID".
Est-il quelque chose comme cela dans Scala?
Vous devez vous connecter pour publier un commentaire.
Ok, nous allons faire des trucs clair. Ce n'utiliser la réflexion sur la Scala de 2,7 et Scala 2.8, parce que le type de
e
est, dans ce cas, un type de structure, qui Scala poignées par la réflexion. Voici le code généré, à nettoyer de temps (scalac -Xprint:cleanup
):Il ya une certaine mise en cache des choses, mais si j'ai alterné entre
id
etname
il invalide le cache déjà. Scala 2.8 fait aussi de la réflexion, et aussi les caches, mais il utilise un système plus efficace de la mise en cache de la technique, ce qui devrait fournir une meilleure performance globale. Pour référence, voici le nettoyage de la Scala 2.8:Vous pouvez également nommer les parties du n-uplet que vous attribuez à l', comme dans:
Vous pouvez également l'utiliser comme:
Quand j'ai lu sur le
_x
syntaxe j'ai pensé qu'il était grand et a beaucoup utilisée. Depuis, j'ai pratiquement arrêté de l'utiliser comme quand je regarde le code que j'ai écrit il y a deux mois j'ai passer une charge de temps à essayer de comprendre ce que les types de la_1
,_2
etc. sont. Je suppose que c'est évident, avec le recul queid
est beaucoup plus lisible quepair._1
.Cela peut aussi être utilisé à l'intérieur des fonctions comme
map
,filter
etc. comme:Noter que dans le
filter
vous pouvez utiliser_
s pour les éléments que vous n'allez pas l'utiliser dans le corps de la fonction. Cela peut être utile lors de l'écrémage sur un code comme celui d'établir quelles parties de structures sont utilisées et comment les valeurs sont construites.Je voudrais simplement faire une classe de cas:
Ne sais pas si c'est aussi efficace que La réponse de Daniel mais je pense que c'est le même (je vous en serais reconnaissant commentaires sur l'). En tout cas, je trouve ça plus lisible, en utilisant une seule ligne supplémentaire qui est partagé si vous avez plus d'un exemple, si
E
. Vous pouvez également ajouter une méthode à la classe de cas, tels que:myTuple(2)
(au moins sans l'aide d'informes sombre de la magie 🙂Comme Juh_ suggère, l'extension d'une classe de cas devrait faire ce que vous voulez:
Classes de fournir une méthode equals, et ils s'étendent également la
Product
trait de caractère, qui est la même caractéristique que la Scala de n-uplets étendre. Peut-être que dans l'avenir ils seront également étendre leProductN
traits.Si vous utilisez anonyme classes comme l'ont proposé certains autres réponses, vous ne finissent pas avec de vrais tuples! Par exemple, vous n'obtenez pas la méthode equals:
Comme de la Scala 2.11 l'extension de
Tuple2
fonctionne, mais c'est déconseillé parce que vous n'êtes pas censé étendre des classes de cas.Vous pouvez également étendre la
Product2
trait de caractère, mais cela ne veut pas fournir des implémentations de méthodes, de sorte que vous devriez écrire toutes les méthodes vous-même.Vous pourriez probablement aussi utiliser un Informe
HList
, ce qui vous donne beaucoup de fantaisie dispose d'au coût de l'ajout d'une dépendance externe.J'ai aussi essayé de Twitter jaqen de la bibliothèque, mais qui ne compile pas pour moi en Scala 2.11.
Je suis actuellement en utilisant Scala 2.11, donc je ne peux pas garantir que ce conseil est valable pour les autres versions de la Scala.
Scala 2.8 a amélioré le système de type, au point qu'il est possible d'avoir de manière statique et hétérogène tapé des tableaux et des listes, donc vraisemblablement la même chose pourrait être fait avec des cartes. Découvrez Jesper Nordenberg blog sur "Type de Listes et Hétérogène Tableaux Typés" pour sa mise en œuvre.