Elixir ist eine dynamisch typisierte Sprache. Das bedeutet, dass der Typ einer Variablen erst zur Laufzeit geprüft wird. Mit dem Match-Operator = binden wir einen Wert beliebigen Typs an einen Variablennamen:
# Bound an integer value of 1
count = 1
# You may re-bind variables
count = 2
# You may re-bind any type to a variable
count = false
# Strings can be created by enclosing characters within double quotes
message = "Success!"
Elixir ist eine funktionale Programmiersprache und verlangt, dass alle benannten Funktionen in einem Modul definiert werden. Mit dem Schlüsselwort defmodule definierst du ein Modul. Alle Module sind zur Laufzeit für alle anderen Module verfügbar und brauchen keinen Zugriffsmodifikator, damit andere Teile des Programms sie sehen können. Ein Modul entspricht einer Klasse in anderen Programmiersprachen.
defmodule Calculator do
# ...
end
Benannte Funktionen müssen in einem Modul definiert werden. Mit dem Schlüsselwort def definierst du eine öffentliche benannte Funktion.
Jede Funktion kann null oder mehr Parameter haben. Der Wert des letzten Ausdrucks in einer Funktion wird immer implizit zurückgegeben.
defmodule Calculator do
def add(x, y) do
x + y
end
end
Du rufst eine Funktion auf, indem du ihren Modul- und Funktionsnamen angibst und für jeden Parameter der Funktion ein Argument übergibst.
sum = Calculator.add(1, 2)
# => 3
Mit dem Schlüsselwort defp kannst du statt def eine private Funktion definieren. Private Funktionen kannst du nur innerhalb des Moduls verwenden, das sie definiert hat.
Wenn du eine Funktion innerhalb desselben Moduls aufrufst, in dem sie definiert ist, kannst du den Modulnamen weglassen.
Du kannst kurze Funktionen auch in einer einzeiligen Syntax schreiben (beachte das Komma , und den Doppelpunkt : um das Schlüsselwort do).
defmodule Calculator do
def subtract(x, y) do
private_subtract(x, y)
end
defp private_subtract(x, y), do: x - y
end
difference = Calculator.subtract(7, 2)
# => 5
difference = Calculator.private_subtract(7, 2)
# => ** (UndefinedFunctionError) function Calculator.private_subtract/2 is undefined or private
# Calculator.private_subtract(7, 2)
Es ist üblich, Funktionen über ihre Arity anzugeben. Die Arity einer Funktion ist die Anzahl der Argumente, die sie entgegennimmt.
# add/3 because this function has three arguments, thus an arity of 3
def add(x, y, z) do
x + y + z
end
Modulnamen solltest du in PascalCase schreiben. Ein Modulname muss mit einem Großbuchstaben A-Z beginnen und darf Buchstaben a-zA-Z, Zahlen 0-9 und Unterstriche _ enthalten.
Variablen- und Funktionsnamen solltest du in snake_case schreiben. Ein Variablen- oder Funktionsname muss mit einem Kleinbuchstaben a-z oder einem Unterstrich _ beginnen, darf Buchstaben a-zA-Z, Zahlen 0-9 und Unterstriche _ enthalten und kann mit einem Fragezeichen ? oder einem Ausrufezeichen ! enden.
Elixir hat eine sehr umfangreiche und gut dokumentierte Standardbibliothek. Die Dokumentation findest du online unter hexdocs.pm/elixir. Speichere diesen Link irgendwo, du wirst ihn oft brauchen!
Zu den meisten eingebauten Datentypen gibt es ein passendes Modul mit Funktionen für diesen Datentyp. So gibt es das Modul Integer für Ganzzahlen, das Modul String für Strings, das Modul List für Listen und so weiter.
Ein bemerkenswertes Modul ist das Modul Kernel. Es stellt die grundlegenden Fähigkeiten bereit, auf denen der Rest der Standardbibliothek aufbaut, etwa arithmetische Operatoren, Makros für den Kontrollfluss und vieles mehr. Die Funktionen des Moduls Kernel werden automatisch importiert, du kannst sie also ohne das Präfix Kernel. verwenden.
Mit Kommentaren kannst du Notizen für andere Entwickler hinterlassen, die den Quellcode lesen. Einzeilige Kommentare in Elixir beginnen mit #.
In dieser Übung schreibst du etwas Code, der dir hilft, eine großartige Lasagne aus deinem Lieblingskochbuch zu kochen.
Du hast fünf Aufgaben, die alle mit der Zeit zu tun haben, die du für das Kochen der Lasagne brauchst.
Definiere die Funktion Lasagna.expected_minutes_in_oven/0, die keine Argumente entgegennimmt und zurückgibt, wie viele Minuten die Lasagne im Ofen bleiben sollte. Laut Kochbuch beträgt die erwartete Backzeit 40 Minuten:
Lasagna.expected_minutes_in_oven()
# => 40
Definiere die Funktion Lasagna.remaining_minutes_in_oven/1, die die tatsächlichen Minuten, die die Lasagne bereits im Ofen war, als Argument entgegennimmt und zurückgibt, wie viele Minuten die Lasagne noch im Ofen bleiben muss, basierend auf der erwarteten Backzeit aus der vorherigen Aufgabe.
Lasagna.remaining_minutes_in_oven(30)
# => 10
Definiere die Funktion Lasagna.preparation_time_in_minutes/1, die die Anzahl der Schichten, die du der Lasagne hinzugefügt hast, als Argument entgegennimmt und zurückgibt, wie viele Minuten du für die Vorbereitung der Lasagne gebraucht hast, wobei jede Schicht 2 Minuten Vorbereitung dauert.
Lasagna.preparation_time_in_minutes(2)
# => 4
Definiere die Funktion Lasagna.total_time_in_minutes/2, die zwei Argumente entgegennimmt: Das erste Argument ist die Anzahl der Schichten, die du der Lasagne hinzugefügt hast, und das zweite Argument ist die Anzahl der Minuten, die die Lasagne bereits im Ofen war. Die Funktion soll zurückgeben, wie viele Minuten du insgesamt mit dem Kochen der Lasagne verbracht hast, also die Summe aus der Vorbereitungszeit in Minuten und der Zeit, die die Lasagne gerade im Ofen verbracht hat.
Lasagna.total_time_in_minutes(3, 20)
# => 26
Definiere die Funktion Lasagna.alarm/0, die keine Argumente entgegennimmt und eine Nachricht zurückgibt, die anzeigt, dass die Lasagne fertig zum Essen ist.
Lasagna.alarm()
# => "Ding!"
Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.