Tracks
/
Elixir
Elixir
/
Übungen
/
Küchenrechner
Küchenrechner

Küchenrechner

Lernübung

Einführung

Tupel

In Elixir ist ein Tupel eine Datenstruktur, die Daten organisiert und eine feste Anzahl von Elementen beliebigen Typs enthält, aber ohne explizite Namen für jedes Element. Tupel werden in Elixir oft für Operationen verwendet, die viele Lesezugriffe auf den Speicher erfordern, denn der Lesezugriff auf ein Element ist eine Operation mit konstanter Laufzeit. Sie werden normalerweise nicht verwendet, wenn Elemente dynamisch hinzugefügt oder entfernt werden müssen, denn statt das vorhandene Tupel zu ändern, wird ein neues Tupel erstellt, für das Speicher im Voraus reserviert werden muss.

In der Praxis werden Tupel in Elixir mit geschweiften Klammern erstellt. Auf die Elemente eines Tupels kann mit der Funktion elem/2 und nullbasierter Indexierung einzeln zugegriffen werden:

empty_tuple = {}
one_element_tuple = {1}
multiple_element_tuple = {1, :a, "hello"}

elem(multiple_element_tuple, 2)
# => "hello"

Tupel als gruppierte Informationen

Tupel werden in der Praxis oft verwendet, um gruppierte Informationen darzustellen.

Float.ratio(0.25)
# => {1, 4} indicating the numerator and denominator of the fraction ¼

Musterabgleich

Die Verwendung von Musterabgleich ist in ausdrucksstarkem, idiomatischem Elixir-Code vorherrschend. Du erinnerst dich vielleicht, dass =/2 als Match-Operator und nicht als Zuweisungsoperator beschrieben wird. Wenn du den Match-Operator verwendest und das Muster auf der linken Seite zur rechten Seite passt, werden alle Variablen auf der linken Seite gebunden. Der Wert der rechten Seite wird zurückgegeben. Wenn es keine Übereinstimmung gibt, wird ein MatchError ausgelöst.

2 = 2
# => 2
# Literals can be matched if they are the same

2 = 3
# => ** (MatchError) no match of right hand side value: 3

{_, denominator} = Float.ratio(0.25)
# => {1, 4}
# the variable `denominator` is bound to the value 4

Denk daran: Übereinstimmungen erfolgen von der rechten zur linken Seite.

Wenn wir im letzten Beispiel eine Variable in einem Musterabgleich nicht brauchen, können wir sie mit _ verwerfen. Jede Variable, die mit einem _ beginnt, wird von der Laufzeitumgebung nicht verfolgt.

Musterabgleich in benannten Funktionen

Musterabgleich ist auch ein nützliches Werkzeug, wenn du mehrere Funktionsklauseln erstellst. Musterabgleich kann bei den Argumenten der Funktionen verwendet werden, was dann bestimmt, welche Funktionsklausel aufgerufen wird, beginnend oben in der Datei bis zur ersten Übereinstimmung. Variablen können in einem Funktionskopf gebunden und im Funktionskörper verwendet werden.

defmodule Example do
  def named_function(:a = variable_a) do
    {variable_a, 1}
  end

  def named_function(:b = variable_b) do
    {variable_b, 2}
  end
end

Example.named_function(:a)
# => {:a, 1}

Example.named_function(:b)
# => {:b, 2}

Example.named_function(:c)
# => ** (FunctionClauseError) no function clause matching in Example.named_function/1

Anleitung

Während du für deine Freunde Kekse backen willst, stellst du fest, dass du einige der im Rezept verwendeten Maßeinheiten umrechnen musst. Da du nur das metrische System kennst, brauchst du einen Weg, um gängige US-Backmaße für dich bequem in Milliliter (mL) umzurechnen.

Verwende diese Umrechnungstabelle für deine Lösung:

Umzurechnende Einheit Volumen in Milliliter (mL)
mL 1 1
US-Cup 1 240
US-Flüssigunze 1 30
US-Teelöffel 1 5
US-Esslöffel 1 15

Als talentierte Programmierer:in in Ausbildung entscheidest du dich dafür, Milliliter als Zwischeneinheit zu verwenden, damit du jede aufgeführte Einheit in jede andere (sogar in sich selbst) umrechnen kannst.

1. Hole den numerischen Anteil aus einem Volumenpaar

Implementiere die Funktion KitchenCalculator.get_volume/1. Wenn man ihr ein Volumenpaar-Tupel übergibt, soll sie nur den numerischen Anteil zurückgeben.

KitchenCalculator.get_volume({:cup, 2.0})
# => 2.0

2. Rechne das Volumenpaar in Milliliter um

Implementiere die Funktion KitchenCalculator.to_milliliter/1. Wenn man ihr ein Volumenpaar-Tupel übergibt, soll sie das Volumen mithilfe der Umrechnungstabelle in Milliliter umrechnen.

Nutze mehrere Funktionsklauseln und Pattern Matching, um die Funktionen für die einzelnen Einheiten zu erstellen. Die Atome, mit denen die einzelnen Einheiten bezeichnet werden, sind: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter. Gib das Ergebnis der Umrechnung in ein Tupel verpackt zurück.

KitchenCalculator.to_milliliter({:cup, 2.5})
# => {:milliliter, 600.0}

3. Rechne das Milliliter-Volumenpaar in eine andere Einheit um

Implementiere die Funktion KitchenCalculator.from_milliliter/2. Wenn man ihr ein Volumenpaar-Tupel und die gewünschte Einheit übergibt, soll sie das Volumen mithilfe der Umrechnungstabelle in die gewünschte Einheit umrechnen.

Nutze mehrere Funktionsklauseln und Pattern Matching, um die Funktionen für die einzelnen Einheiten zu erstellen. Die Atome, mit denen die einzelnen Einheiten bezeichnet werden, sind: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter

KitchenCalculator.from_milliliter({:milliliter, 1320.0}, :cup)
# => {:cup, 5.5}

4. Rechne von einer beliebigen Einheit in eine beliebige andere um

Implementiere die Funktion KitchenCalculator.convert/2. Wenn man ihr ein Volumenpaar-Tupel und die gewünschte Einheit übergibt, soll sie das angegebene Volumen in die gewünschte Einheit umrechnen.

KitchenCalculator.convert({:teaspoon, 9.0}, :tablespoon)
# => {:tablespoon, 3.0}
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Elixir Exercism

Bereit, mit Küchenrechner zu starten?

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