In Elixir sind Funktionen Bürger erster Klasse. Das bedeutet:
Anonyme Funktionen haben, im Gegensatz zu benannten Funktionen, keine statische Referenz, die ihnen zur Verfügung steht. Sie sind nur dann verfügbar, wenn du sie einer Variablen zuweist oder sie sofort aufrufst.
Wir können anonyme Funktionen unter anderem verwenden, um:
Anonyme Funktionen beginnen mit dem reservierten Wort fn, die Argumente werden mit dem Token -> vom Funktionskörper getrennt, und sie enden mit einem end. Wie bei benannten Funktionen wird der letzte Ausdruck in der Funktion implizit zurückgegeben, und zwar an die aufrufende Funktion.
Um eine Funktionsreferenz aufzurufen, musst du einen . zwischen die Referenzvariable und die Liste der Argumente setzen:
function_variable = fn param ->
param + 1
end
function_variable.(1)
# => 2
Du kannst sogar die Kurzform der Capture-Notation verwenden, um das noch kompakter zu machen:
variable = &(&1 + 1)
variable.(1)
# => 2
Elixir unterstützt viele Funktionen für die Arbeit mit Bits, die im Bitwise-Modul zu finden sind.
band/2: Bitweises UNDbsl/2: Bitweises Verschieben nach linksbsr/2: Bitweises Verschieben nach rechtsbxor/2: Bitweises XORbor/2: Bitweises ODERbnot/1: Bitweises NICHTHier ist ein Beispiel, wie du eine bitweise Funktion verwendest:
Bitwise.bsl(1, 3)
# => 8
Alle bitweisen Funktionen arbeiten nur mit Ganzzahlen.
Wenn du Elixir in Version 1.9 oder älter verwendest, musst du require Bitwise am Anfang der Moduldefinition aufrufen, um das Bitwise-Modul verwenden zu können.
In dieser Übung sollst du die Software für ein Verschlüsselungsgerät schreiben, das Daten transformiert. Du brauchst eine Möglichkeit, komplizierte Funktionen flexibel zu erstellen, indem du einfachere Funktionen kombinierst.
Gib für jede Aufgabe eine anonyme Funktion zurück, die aus dem aufrufenden Gültigkeitsbereich heraus aufgerufen werden kann.
Alle Funktionen sollten Ganzzahlen als Argumente erwarten. Ganzzahlen eignen sich in Elixir auch für bitweise Operationen.
Implementiere Secrets.secret_add/1. Sie sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und zu diesem das an secret_add übergebene Argument addiert.
adder = Secrets.secret_add(3)
adder.(2)
# => 5
Implementiere Secrets.secret_subtract/1. Sie sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und von diesem das an secret_subtract übergebene Geheimnis subtrahiert.
subtractor = Secrets.secret_subtract(2)
subtractor.(3)
# => 1
Implementiere Secrets.secret_multiply/1. Sie sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und es mit dem an secret_multiply übergebenen Geheimnis multipliziert.
multiplier = Secrets.secret_multiply(7)
multiplier.(3)
# => 21
Implementiere Secrets.secret_divide/1. Sie sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und es durch das an secret_divide übergebene Geheimnis dividiert.
divider = Secrets.secret_divide(3)
divider.(32)
# => 10
Nutze die Ganzzahldivision, damit die Ausgabe mit dem erwarteten Eingabewert der anderen Funktionen kompatibel ist.
Implementiere Secrets.secret_and/1. Sie sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und eine bitweise und-Operation damit und mit dem an secret_and übergebenen Geheimnis durchführt.
ander = Secrets.secret_and(1)
ander.(2)
# => 0
Implementiere Secrets.secret_xor/1. Sie sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und eine bitweise xor-Operation damit und mit dem an secret_xor übergebenen Geheimnis durchführt.
xorer = Secrets.secret_xor(1)
xorer.(3)
# => 2
Implementiere Secrets.secret_combine/2. Sie sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und die beiden an secret_combine übergebenen Funktionen der Reihe nach darauf anwendet.
add_one = Secrets.secret_add(1)
multiply_by_2 = Secrets.secret_multiply(2)
combined = Secrets.secret_combine(add_one, multiply_by_2)
combined.(3)
# => 8
Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.