Do you want to pick up from where you left of?
Take me there

Sigils

Arbeiten mit sigils und erstellen dieser.

Überblick über Sigils

Elixir bietet eine alternative Syntax, um Literale darzustellen und damit zu arbeiten. Ein sigil startet mit der Tilde ~, gefolgt von einem Zeichen. Der Kern von Elixir bietet uns einige eingebaute sigils, jedoch ist es auch möglich eigene zu erstellen, falls wir die Sprache erweitern möchten.

Die Liste vorhandener sigils beinhaltet:

Eine Liste an Trennzeichen beinhaltet:

Characterlisten

Die ~c und ~C sigils erstellen jeweils Characterlisten. Zum Beispiel

iex> ~c/2 + 7 = #{2 + 7}/
'2 + 7 = 9'

iex> ~C/2 + 7 = #{2 + 7}/
'2 + 7 = \#{2 + 7}'

Wir können sehen, dass das kleingeschriebene ~c die Berechnung interpoliert, wohingegen das großgeschriebene ~C sigil dieses nicht tut. Wir werden sehen, dass diese Großschreibung/Kleinschreibung ein oft verwendetes Motiv bei eingebauten sigils ist.

Reguläre Ausdrücke

Die ~r und ~R sigils werden für reguläre Ausdrücke benutzt. Wir erstellen sie entweder spontan oder für den Gebrauch innerhalb von Regex-Funktionen. Beispielsweise:

iex> re = ~r/elixir/
~r/elixir/

iex> "Elixir" =~ re
false

iex> "elixir" =~ re
true

Wir können im ersten Test auf Gleichheit sehen, dass Elixir nicht auf den regulären Ausdruck matched. Das liegt daran, dass der Anfang ein Großbuchstabe ist. Da Elixir Perl Compatible Regular Expressions (PCRE) unterstützt, können wir i an das Ende unseres sigils anhängen, um die Beachtung von Groß- und Kleinschreibung auszuschalten.

iex> re = ~r/elixir/i
~r/elixir/i

iex> "Elixir" =~ re
true

iex> "elixir" =~ re
true

Des Weiteren bietet Elixir die Regex API, welche auf die reguläre Ausdrücke-Bibliothek von Erlang aufbaut. Lass uns Regex.split/2 mit Hilfe eines regex sigils implementieren:

iex> string = "100_000_000"
"100_000_000"

iex> Regex.split(~r/_/, string)
["100", "000", "000"]

Wie wir sehen können wird der String "100_000_000" an dessen Unterstrichen getrennt dank des ~r/_/ sigils. Die Regex.split-Funktion gibt eine Liste zurück.

String

Die ~s und ~S sigils werden dafür genutzt Strings zu generieren. Zum Beispiel:

iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"

iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"

Wo ist der Unterschied? Der Unterschied ist ähnlich zum Characterliste-sigil, das wir bereits gesehen haben. Die Antwort ist Interpolation und der Gebrauch von Escapesequenzen. Wenn wir nochmal einen Blick darauf werfen:

iex> ~s/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir school"

iex> ~S/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir \#{String.downcase \"SCHOOL\"}"

Wörterlisten

Das Wortlisten-sigil kann von Zeit zu Zeit praktisch sein. Es kann sowohl Zeit als auch Tastenanschläge sparen, sowie die Komplexität der Codebasis verringern. Nimm dieses simple Beispiel:

iex> ~w/i love elixir school/
["i", "love", "elixir", "school"]

iex> ~W/i love elixir school/
["i", "love", "elixir", "school"]

Wir können sehen, dass das zwischen den Abgrenzern anhand der Whitespaces in eine Liste geteilt wird. Jedoch gibt es keinen Unterschied zwischen den beiden Beispielen. Um es nochmal zu sagen: Der Unterschied kommt erst bei Interpolation und Escapesequenzen, wie etwa hier:

iex> ~w/i love #{'e'}lixir school/
["i", "love", "elixir", "school"]

iex> ~W/i love #{'e'}lixir school/
["i", "love", "\#{'e'}lixir", "school"]

NaiveDateTime

NaiveDateTime kann nützlich sein, um schnell ohne Zeitzone ein struct zu erstellen, das DateTime repräsentiert.

In den meisten Fällen werden wir es vermeiden ein NaiveDateTime struct direkt zu benutzen. Für pattern matching ist es jedoch sinnvoll. Zum Beispiel:

iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07") == {:ok, ~N[2015-01-23 23:50:07]}

Sigils erstellen

Eines der Ziele von Elixir ist eine erweiterbare Programmiersprache zu sein. Es sollte daher nicht überraschen, dass du deine eigenen sigils erstellen kannst. In diesem Beispiel werden wir ein sigil erstellen, dass einen String in Großbuchstaben umwandelt. Da es dafür bereits im Kern von Elixir eine Funktion gibt (String.upcase/1), werden wir unser sigil darum wickeln.


iex> defmodule MySigils do
...>   def sigil_u(string, []), do: String.upcase(string)
...> end

iex> import MySigils
nil

iex> ~u/elixir school/
ELIXIR SCHOOL

Zuerst definieren wir ein Modul namens MySigils und innerhalb dieses Moduls erstellen wir eine Funktion sigil_u. Da es kein existierendes ~u sigil im vorhandenen sigil space gibt, können wir es benutzen. Das _u gibt an, dass wir u als das Zeichen nach der Tilde benutzen wollen. Die Funktionsdefinition muss zwei Argumente aufnehmen, den Input und eine Liste.

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!