7
votes

Cela a-t-il un sens d'utiliser le motif correspondant à Scala avec des cas vraiment simples?

in 'programmation dans SCALA, deuxième édition' à la page 410 Vous pouvez trouver la classe la simulation em> qui ont la méthode suivante: xxx pré>

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()
}


0 commentaires

4 Réponses :


4
votes

Il y a quelques raisons:

  1. 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.

  2. 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.


0 commentaires

3
votes

La correspondance des motifs est plus idiomatique dans SCALA, et vous protège plus facilement des conditions limites.

dans le code xxx

Agenda.head et agenda.tail lancera un nosuchelementException exception si agenda est une liste vide, afin de le faire fonctionner réellement que vous devez ajouter un Vérifiez cela.

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: xxx


3 commentaires

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) ou utilisez agenda.heoption.foreach {item => agenda = agenda.tail; Curtime = item.time; item.action ()}



9
votes

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

  1. Vous vouliez pratiquer le motif correspondant à
  2. Vous vouliez un matchException au lieu d'un nosuchelementException
  3. Vous allez remplir dans d'autres cas plus tard.

0 commentaires

0
votes

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 _ => . 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 et queue pourrait être quelque chose comme: xxx


0 commentaires