Einmal musste ich den Job wechseln. Vorher habe ich nur mit Sprachen wie Python, C ++, C # und ein paar ähnlichen gearbeitet. Und jetzt musste ich anfangen, mit einer funktionalen Sprache zu arbeiten. Der erste Eindruck war "Was zum Teufel ist das?" Es gelang mir jedoch, mich schnell genug anzupassen. Als nächstes werde ich über die wichtigsten Punkte sprechen, an die ich mich gewöhnen musste oder die ich verstehen musste, um schnell und angemessen mit dem Schreiben zu beginnen.
1.
MustervergleichDies ist eine der wichtigsten Sprachfunktionen. Aber es vollständig zu verstehen, bis Sie wirklich anfangen, in der Sprache zu schreiben, ist ein wenig schwierig. Das erste, was ich über Pattern Matching gelesen habe, ist, dass Sie dank dieser Funktion einfach Daten aus Strukturen extrahieren und an Variablen binden können. Tatsächlich ist aber alles etwas komplizierter. Pattern Matching funktioniert fast überall in einer bestimmten Sprache. Ich werde drei Beispiele geben, die die Hauptanwendungen veranschaulichen, die ich fast ständig benutze.
Beispiel 1. Per Definition:
{tuple_item_1, tuple_item_2} = tuple
- teilt ein 2-Element-Tupel in zwei Variablen auf, die dann verwendet werden können.
[head_item | tail_list] = list
- teilt die Liste in das erste Element in der Liste und die Liste ohne das erste Element auf.
Beispiel 2. Vergleich im Fall:
case get_elem(struct) do {:ok, elem} -> … {:error, reason} -> … end
Die Funktion
get_elem (struct) gibt ein Tupel zurück. Mit case können Sie sofort Daten extrahieren und eine weitere Abfolge von Aktionen auswählen.
Beispiel 3. Feature-Mapping:
def function_1(params, :ok) do end def function_1(params, :error) do end def function_1(params, _) do end
Hier wird tatsächlich dieselbe Funktion vorgestellt, die zwei Parameter akzeptiert. Mit dem Mustervergleich können Sie auswählen, welche Funktion ausgeführt werden soll.
Ein bisschen über Pattern Matching. Der Vergleich erfolgt immer von oben nach unten. In diesem Beispiel wird beim Aufrufen von
function_1 aus zwei Parametern zunächst überprüft, ob der zweite Parameter
: ok ist . Wenn die erste Prüfung fehlschlägt, wird geprüft auf
: Fehler . Und wenn nicht noch einmal, dann geben wir auf jeden Fall die dritte Version der Methode ein. Der Unterstrich bedeutet "irgendwelche Daten" sowie die Tatsache, dass die empfangenen Daten uns nicht interessieren, das heißt, wir werden sie nicht verwenden. Wenn
function_1 (params, _) die erste in der Liste wäre, würde das Programm sie immer auswählen und die beiden anderen Methoden würden niemals funktionieren. Wenn das gewünschte Muster nicht gefunden wird, wird eine Ausnahme ausgelöst.
2.
PipelineDies sind Konstruktionen der folgenden Form:
param_1 |> func_1() |> func_2(param_2) …
Auf den ersten Blick scheint etwas Müll. Es sei jedoch daran erinnert, dass Elixier eine funktionale Sprache ist. In einer funktionalen Sprache ist es ganz normal, Funktionsfunktionsberechnungen ohne Zwischenvariablen durchzuführen. Pipeline ist nur ein bequemer Eintrag. Die Sprache selbst bittet um Klarheit, um die Pipeline mit einer Variablen oder einem Wert zu starten.
Das obige Beispiel kann wie folgt umgeschrieben werden:
func_2(func_1(param_1), param_2)
Mit anderen Worten, die Pipeline leitet das Ergebnis der Berechnung der vorherigen Funktion mit dem ersten Argument zur nächsten Funktion um.
3.
Fehlende ZyklenEs gibt keine Zyklen in Elixir. Diese Tatsache verursachte den größten Schock in mir und ist am schwierigsten zu verstehen. Als nächstes kommt meine Meinung und Vision, die möglicherweise nicht mit der Realität und der Theorie übereinstimmen.
Die Wurzeln dieser Tatsache liegen im funktionalen Programmierparadigma, von dem eines besagt, dass das Ergebnis eines Programms die Arbeit einer Funktion ist, die andere Funktionen aufrufen kann, und das Programm das Speichern von Zwischenzuständen nicht beinhaltet. Zyklen sind wiederum so ausgelegt, dass sie den Zustand außerhalb des Zyklus wiederholt ändern.
Zwei Dinge dienen als Ersatz für Zyklen - Rekursions- und Bibliotheksmethoden für die Arbeit mit unzähligen Elementen der Sprache.
Ein bisschen mehr über die kleinen Dinge.1. Es gibt keine Klassen in Elixir, aber es gibt Kontexte. Im Wesentlichen ersetzen Kontexte in gewisser Weise Klassen. Die genaueste Beschreibung des Kontexts mit den Augen des S-Sharper: Kontexte sind eine Kreuzung zwischen einer Klasse und einem Namespace in Sharpe, und der Kontext ist dem Namespace viel näher.
2. Atome. In Elixir gibt es so etwas wie ein Atom. Ein Atom ist im Wesentlichen eine Art „Etikett“. Der einfachste Weg, sie zu behandeln, sind spezielle Linien. Die Beispiele in diesem Artikel hatten bereits zwei Atome
:: ok,: error . Dank Atomen sind Pattern Matching und komplexe Logikkonstrukte viel einfacher. Im Wesentlichen sind dies Konstanten, deren Wert ihr Name ist. Ein Atom hat immer ein ":" vor einem Namen.
3. Wie man Methodenheader richtig liest. In Elixir ist es üblich, Methoden wie folgt zu bezeichnen (dies wird besonders häufig in der Dokumentation gesehen):
& function / 2 . Es wird als Methode mit dem Namen "function" und arity 2 gelesen. Arity ist die Anzahl der Argumente.
Was mir geholfen hat, mich in die Sprache zu integrieren.Erstens ist dies ein Verzeichnis auf dem Android "Elixir Tutorial". Es ist gut, weil es kurz die Hauptpunkte der Sprache und ihrer Syntax behandelt und auf dem Bus gelesen werden kann. Weniger: Es ist auf Englisch und daher nicht für jeden geeignet.
Zweitens das Buch "Introduction to Elixir" von Senloren S., Eisenberg D ... Dieses Buch zeigt die Methoden der Arbeit mit der Sprache und erklärt sie. Es ist leicht zu lesen und ermöglicht es Ihnen, Ihre Arbeit mit der Sprache erheblich zu verbessern. Es kann auch in russischer Sprache gefunden werden.
Drittens offizielle Online-Dokumentation. Es ist bequem erstellt und ermöglicht es Ihnen, schnell die erforderlichen Abschnitte / Methoden mit einer detaillierten Beschreibung und Beispielen zu finden.
Das ist alles.
Materialliste:
1.
Elixier-Tutorial2. Senloren S., Eisenberg D. Einführung in Elixir. Einführung in die funktionale Programmierung. - O'Reilly, 2017.
3.
Offizielle Dokumentation.