Pour créer une nouvelle classe qui peut être utilisé dans une Scala pour la compréhension, il semble que tout ce que vous devez faire est de définir une fonction de carte:pourquoi le filtre doit-il être défini pour la correspondance de modèle dans une boucle for dans scala?
scala> class C[T](items: T*) {
| def map[U](f: (T) => U) = this.items.map(f)
| }
defined class C
scala> for (x <- new C(1 -> 2, 3 -> 4)) yield x
res0: Seq[(Int, Int)] = ArrayBuffer((1,2), (3,4))
Mais cela ne fonctionne que pour simple pour les boucles où il n'y a motif correspondant sur le côté gauche de <-
. Si vous essayez de correspondance de motif là-bas, vous obtenez une plainte que la méthode filter
n'est pas définie:
scala> for ((k, v) <- new C(1 -> 2, 3 -> 4)) yield k -> v
<console>:7: error: value filter is not a member of C[(Int, Int)]
for ((k, v) <- new C(1 -> 2, 3 -> 4)) yield k -> v
Pourquoi est-filtre nécessaire pour mettre en œuvre le modèle correspondant ici? J'aurais pensé Scala serait tout simplement traduire la boucle au-dessus dans l'appel map
équivalent:
scala> new C(1 -> 2, 3 -> 4).map{case (k, v) => k -> v}
res2: Seq[(Int, Int)] = ArrayBuffer((1,2), (3,4))
Mais cela semble bien fonctionner, de sorte que la boucle doit se traduire par autre chose. Qu'est-ce qui est traduit en ce qui a besoin de la méthode filter
?
J'ai vérifié le code compilé avec et sans '5'. Lorsqu'il n'y a pas de '5', le filtre n'est pas utilisé. – IttayD
Wow, je ne me suis jamais rendu compte que pour les boucles jetteraient silencieusement les éléments non-assortis. Cela ressemble à un gotcha subtile je ferais mieux de faire attention. – Steve
La version de 'map' est presque aussi dangereuse, car il n'y a aucun avertissement qu'elle peut lancer. Malheureusement, il n'y a actuellement aucune syntaxe pour déstructurer les arguments dans un littéral de fonction sans utiliser de fonction partielle. –