in 'programmation dans SCALA, deuxième édition' à la page 410 Vous pouvez trouver la classe la simulation em> qui ont la méthode suivante: Je suis curieux pourquoi odersky Mise en œuvre avec la correspondance des motifs plutôt que comme celle-là: P> private def next() {
val item = agenda.head
agenda = agenda.tail
curtime = item.time
item.action()
}
4 Réponses :
Il y a quelques raisons: p>
Une partie du point du livre est de vous faire penser aux termes scala (fonctionnels); La correspondance des motifs est l'équivalent de programmation fonctionnelle. P> li>
correspondance de modèle et l'approche fonctionnelle sont le modèle naturel de Scala et permettent des choses comme la concurrence de manière naturelle; Apprenez que le modèle et vos programmes Scala seront prêts pour des utilisations plus avancées. P> li> ol>
La correspondance des motifs est plus idiomatique dans SCALA, et vous protège plus facilement des conditions limites.
dans le code p> La version correspondante du modèle a réellement un problème similaire (comme indiqué dans les commentaires), mais je trouve le nettoyeur de correctif, car tout ce que vous avez à faire est d'ajouter un autre motif: P> Agenda.head code> et
agenda.tail code> lancera un
nosuchelementException code> exception si
agenda code> est une liste vide, afin de le faire fonctionner réellement que vous devez ajouter un Vérifiez cela. p>
La version correspondante des motifs lancera MatchException si le motif ne correspond pas
@gerferra: Je suis corrigé. Mais la version correspondante de modèle en tout cas a une solution simple. Je vais mettre à jour la réponse.
L'autre version a également une solution simple: soit envelopper dans si (! Agenda.isempty) code> ou utilisez
agenda.heoption.foreach {item => agenda = agenda.tail; Curtime = item.time; item.action ()} code>
Normalement, je l'écrirais comme vous l'avez fait. (Même si la correspondance des motifs est assez efficace, elle n'est pas aussi efficace que la tête / la queue.) Vous utiliseriez le motif correspondant si P>
matchException code> au lieu d'un nosuchelementException code> li>
- Vous allez remplir dans d'autres cas plus tard. Li>
ol>
Je suppose d'abord que des exceptions ne sont pas une inquiétude ici, il y a probablement une vérification avant que cette méthode "suivante" soit appelée. En fait, c'est probablement la raison de l'annotation "non cochée" aussi, il ne peut donc pas avoir à mettre un cas supplémentaire _ => code>. Je pense que le raisonnement était de plus qu'il souhaitait utiliser «UNAPPLY». Une alternative ici sans le motif correspondant, mais aussi sans
tête code> et
queue code> pourrait être quelque chose comme: