Il ne me semble pas très bon de toujours répéter une définition de ligne de tuple chaque fois que j'en ai besoin. Puis-je simplement le nommer et l'utiliser comme nom de type? Ce serait bien de nommer ses champs aussi au lieu d'utiliser ._1, ._2 etc.Puis-je nommer un tuple (définir une structure?) Dans Scala 2.8?
Répondre
En ce qui concerne votre première question, vous pouvez simplement utiliser un alias de type:
type KeyValue = (Int, String)
Et, bien sûr, Scala est un langage orienté objet, donc en ce qui concerne votre deuxième sur la façon de se spécialiser un tuple, le mot magique est héritage:
case class KeyValue(key: Int, value: String) extends (Int, String)(key, value)
Voilà. La classe n'a même pas besoin d'un corps.
val kvp = KeyValue(42, "Hello")
kvp._1 // => res0: Int = 42
kvp.value // => res1: String = "Hello"
Notez, cependant, que des classes héritant de cas (ce qui est Tuple2
), est dépréciée et peut être rejeté dans l'avenir. Voici le compilateur d'avertissement que vous obtenez pour la définition de classe ci-dessus:
avertissement: classe de cas
class KV
a le cas ancêtre de classeclass Tuple2
. Cela a été déprécié pour compliquer indûment à la fois l'utilisation et la mise en œuvre. Vous devriez plutôt utiliser des extracteurs pour la correspondance de motifs sur les nœuds non-feuilles.
L'alias de type est bon pour nommer votre Tuple, mais essayez plutôt d'utiliser une classe de casse. Vous pourrez utiliser des paramètres nommés
Exemple avec tuple:
def foo(a : Int) : (Int, String) = {
(a,"bar")
}
val res = foo(1)
val size = res._1
val name= res._2
Avec une classe de cas:
case class Result(size : Int , name : String)
def foo(a : Int) : Result = {
Result(a,"bar")
}
val res = foo(1)
val size = res.size
val name= res.name
Voici une solution qui crée un alias de type et un objet usine.
scala> type T = (Int, String)
defined type alias T
scala> object T { def apply(i: Int, s: String): T = (i, s) }
defined module T
scala> new T(1, "a")
res0: (Int, String) = (1,a)
scala> T(1, "a")
res1: (Int, String) = (1,a)
Cependant, comme d'autres l'ont mentionné, vous devriez probablement créer une classe de cas.
Bien que d'autres l'aient dit, les classes explicites (cas) sont les meilleures au sens général.
Cependant pour des scénarios localisés ce que vous pouvez faire est d'utiliser la tuple extractor pour améliorer la lisibilité du code:
val (first, second) = incrementPair(3, 4)
println(s"$first ... $second")
Compte tenu d'une méthode retournant un tuple:
def incrementPair(pair: (Int, Int)) : (Int, Int) = {
val (first, second) = pair
(first + 1, second + 1)
}
- 1. Scala 2.8 CanBuildFrom
- 2. Scala 2.8 Breakout
- 3. Scala 2.8: _ comportement changé?
- 4. scala tuple déballage
- 5. Comment utiliser l'annotation @PersistentCapable dans Scala 2.8
- 6. REST dans ascenseur 2.0 + Scala 2.8
- 7. Comment intégrer l'interpréteur Scala 2.8 dans une application Java?
- 8. Un problème de conversions implicites dans scala 2.8
- 9. Scala 2.8: utiliser l'annotation Java avec un paramètre de tableau
- 10. Simple question sur tuple de scala
- 11. Comment configurer SBT pour utiliser Scala 2.8?
- 12. IntelliJ IDEA 9 et Scala 2.8
- 13. Scala 2.8 TreeMap et commande personnalisée
- 14. scala 2.8 implict collections java conversions
- 15. Comment appliquer une fonction à un tuple?
- 16. comment passer une chaîne * scala vararg à une méthode Java en utilisant Scala 2.8
- 17. Sortie différente de l'appariement sur la séquence dans Scala 2.8
- 18. Scala 2.8 - Problème potentiel avec des arguments nommés
- 19. Scala swing 2.8 Comment définir la couleur de fond d'un Slider?
- 20. scala 2.8 impliquer des conversions de Java conversions
- 21. Compiler le code Scala 2.8.x avec Apache Buildr
- 22. maven et soulever avec scala 2.8: manquant de levage manquant?
- 23. Problème pour définir une structure
- 24. nouveau Iterable {portage} Code de Scala 2.7.7 à 2.8
- 25. Scala 2.8 Document de conception d'acteur? Document de conception Akka?
- 26. Utilisation du moteur de script Scala 2.8 d'Apache Sling
- 27. Comportement étrange: Scala Acteurs 2.7.7 vs. 2.8-Snapshot
- 28. Comment vérifier qu'un tableau contient une valeur particulière dans Scala 2.8?
- 29. Existe-t-il une boucle do-until (postcondition) dans Scala 2.8?
- 30. Comment faire pour porter le code Scala 2.7.7 qui utilise scala.collection.jcl à Scala 2.8?
Ne pas tuples travailler plus vite que le cas Des classes? La tâche est un traitement complexe de grandes quantités de données simples, une sorte de calcul des nombres. – Ivan
@Ivan: Les tuples * sont des classes de cas, n'est-ce pas? –
Les tuples sont en effet des classes de cas! –