Tracks
/
Elixir
Elixir
/
Übungen
/
Geheimnisse
Geheimnisse

Geheimnisse

Lernübung

Einführung

Anonyme Funktionen

In Elixir sind Funktionen Bürger erster Klasse. Das bedeutet:

  • Benannte und anonyme Funktionen können Variablen zugewiesen werden.
  • Benannte und anonyme Funktionen können wie Daten als Argumente und Rückgabewerte weitergegeben werden.
  • Anonyme Funktionen können dynamisch erstellt werden.

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:

  • Daten mithilfe des lexikalischen Gültigkeitsbereichs zu verbergen (auch als Closure bekannt).
  • Funktionen zur Laufzeit dynamisch zu erstellen.

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

Bit-Manipulation

Elixir unterstützt viele Funktionen für die Arbeit mit Bits, die im Bitwise-Modul zu finden sind.

  • band/2: Bitweises UND
  • bsl/2: Bitweises Verschieben nach links
  • bsr/2: Bitweises Verschieben nach rechts
  • bxor/2: Bitweises XOR
  • bor/2: Bitweises ODER
  • bnot/1: Bitweises NICHT

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

Anleitung

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.

1. Erstelle einen Addierer

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

2. Erstelle einen Subtrahierer

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

3. Erstelle einen Multiplizierer

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

4. Erstelle einen Dividierer

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.

5. Erstelle einen „and“-Verknüpfer

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

6. Erstelle einen „xor“-Verknüpfer

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

7. Erstelle einen Funktionskombinierer

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
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Elixir Exercism

Bereit, mit Geheimnisse zu starten?

Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.