Ich lerne Elixir, und kann nicht den Vorteil der Mustererkennung über guten alten Schalter Fall sehen. Was vermisse ich?Mustervergleich: Vorteil gegenüber Switch-Case?
Antwort
Kurz gesagt, Elixirs Muster entspricht case
wird Sie konzentrieren sich auf die Form Ihrer Daten. Anstatt nahezu alle Ausdrücke in der Sprache zuzulassen und nach einer echten Bedingung zu suchen, zeigen Sie dem Leser, welche Formen in Ihren Daten wichtig sind. Es ist mehr Absicht enthüllt.
Elixir hat sowohl case
als auch cond
. Ersteres nimmt einen Wert an und führt verschiedene Musterübereinstimmungen durch. Letzteres nimmt keinen Wert an, sondern wertet stattdessen einige Ausdrücke aus, bis es einen gefunden hat, der truthig ist. A cond
funktioniert wie if … elseif … else
.
list = [3,2,1]
string = "abc"
case list do
[] -> :empty # won't match
[1 | t] -> :starts_with_one # won't match
[3, b, c] -> "3, #{b} and #{c}" # match!
_ -> :fallback # _ would match anything
end
cond do
List.last(list) == 2 -> :two_at_the_end # false
length(string) == 3 -> :three_letters # true
true -> :fallback
end
Wie Sie sehen, gibt es wirklich nichts, was den Ausdruck in cond
verbindet. Sie müssen nicht auf die gleichen Daten reagieren. Sie können auch Ausdrücke verwenden, die beim Mustervergleich nicht zulässig sind. Beide Aspekte machen cond
sehr flexibel, aber es ist auch irgendwie ein Code-Geruch. Es gibt keine Kohärenz zum Block. Ausdrücke können Nebenwirkungen haben. Ich muss genauer auf eine cond
als eine case
aussehen.
Im Gegensatz dazu lässt mich die case
Ausdruck sehr explizit Grund für die Form meiner Daten. Alle Übereinstimmungen werden mit denselben Daten durchgeführt, so dass sie einen natürlichen Zusammenhalt haben. Es erzählt einem Leser viel über die Erwartungen des Autors an einige Daten. Es ist sehr Absicht enthüllt. Es zeigt schnell die Formen, die der Autor erwartet, die Daten zu nehmen, und alle Sonderfälle, die anders behandelt werden sollten. Wenn Sie eine case
Anweisung lesen, können Sie sich auch auf die Daten konzentrieren.
Mit der Mustererkennung können Sie auch Teile des Musters erfassen. Ich erfasse das zweite und dritte Listenelement in dem passenden Muster. Sie sind nur innerhalb des Blocks case
verfügbar und "lecken" nicht.
Die eingeschränkte Menge an Ausdrücken, die in einer Musterübereinstimmung erlaubt sind, bedeutet auch, dass sie im Allgemeinen sehr schnell ist.
Eine Case-Anweisung ist tatsächlich Mustererkennung. Jede Übereinstimmung in der case-Anweisung ist eine Übereinstimmung und kann zum Extrahieren von Segmenten der Übereinstimmung verwendet werden. Darüber hinaus unterstützt es Wachen. Zum Beispiel:
case my_map do
%{type: 1, data_for_1: data} -> "Data 1 is %{data}"
%{type: 2, data_for_2: data} => "Data 2 is %{data}"
map -> "No matching type found: %{inspect map}"
end
Nun, vielleicht wollten Sie fragen, was ist der Vorteil der Verwendung von Fall über mehrere Funktionsköpfe?
In diesem Fall ist es eine Frage des Stils/der Vorliebe. Es reduziert jedoch die Größe Ihrer Funktion. Ich bevorzuge den Ansatz mit mehreren Funktionsursachen, besonders wenn jeder Codeblock groß ist.
- 1. Inline Montage Leistung Vorteil gegenüber C
- 2. Welchen Vorteil hat FutureTask gegenüber Callable?
- 3. Vorteil von T4-Vorlagen gegenüber Klassendateien
- 4. Welchen Vorteil bietet Restangular gegenüber ngResource?
- 5. Vorteil von RESTEasy gegenüber Apache CXF?
- 6. Vorteil von QString gegenüber std :: string
- 7. Vorteil von `make_unique` gegenüber einfachem Konstruktor?
- 8. Warum funktioniert die Switchcase-Anweisung in Java?
- 9. Was ist der Vorteil von Multimap gegenüber Vektoren?
- 10. Was ist der Vorteil eines Listenverständnisses gegenüber einer for-Schleife?
- 11. Was ist der Vorteil von UnityContainer.Resolve gegenüber Activator.CreateInstance?
- 12. Welchen Vorteil hat ein Key-Value Store gegenüber Bigtable?
- 13. Tesseract: Vorteil gegenüber mehrseitiger Trainingsdatei und mehreren separaten Dateien?
- 14. Vorteil der Verwendung eines DialogFragments gegenüber dem einfachen AlertDialog?
- 15. Was könnte der Vorteil von ServletRequestWrapper gegenüber Filter sein?
- 16. Drawable Vorteil gegenüber Bitmap für den Speicher in android
- 17. Hat Math.Floor gegenüber dem expliziten Ganzzahl-Casting einen Vorteil?
- 18. Was ist der Vorteil von Pip gegenüber Anaconda?
- 19. Mule :: Mustervergleich
- 20. gcc compiler vorteil
- 21. Vorteil der Pfeile über Funktionen
- 22. _ * Verwendung ist Scala Mustervergleich
- 23. Datensatztyp Mustervergleich in Ocaml
- 24. Makros, Spleiß und Mustervergleich
- 25. Mustervergleich mit formlosem Koppelprodukt
- 26. Mustervergleich in einer Datei
- 27. Mustervergleich in Clojure/Java
- 28. Mustervergleich von Arrays
- 29. Mustervergleich in Scala
- 30. Unable Mustervergleich auf Word8
Andere Sprache, gleiche Frage: http://stackoverflow.com/questions/21355060/what-ist-the-advantage-of-using-scala-pattern-matching-instead-of-java-switch-cas – JJJ