Elixier - Siegel

In diesem Kapitel werden wir Siegel untersuchen, die Mechanismen, die die Sprache für die Arbeit mit Textdarstellungen bereitstellt. Siegel beginnen mit dem Tilde-Zeichen (~), gefolgt von einem Buchstaben (der das Siegel kennzeichnet) und einem Begrenzer. Optional können Modifikatoren nach dem endgültigen Trennzeichen hinzugefügt werden.

Regex

Regexes in Elixir sind Siegel. Wir haben ihre Verwendung im Kapitel String gesehen. Nehmen wir noch einmal ein Beispiel, um zu sehen, wie wir Regex in Elixir verwenden können.

# A regular expression that matches strings which contain "foo" or
# "bar":
regex = ~r/foo|bar/
IO.puts("foo" =~ regex)
IO.puts("baz" =~ regex)

Wenn das obige Programm ausgeführt wird, wird das folgende Ergebnis erzeugt:

true
false

Siegel unterstützen 8 verschiedene Begrenzer -

~r/hello/
~r|hello|
~r"hello"
~r'hello'
~r(hello)
~r[hello]
~r{hello}
~r<hello>

Der Grund für die Unterstützung verschiedener Begrenzer ist, dass verschiedene Begrenzer für verschiedene Siegel besser geeignet sein können. Beispielsweise kann die Verwendung von Klammern für reguläre Ausdrücke eine verwirrende Wahl sein, da sie mit den Klammern innerhalb des regulären Ausdrucks gemischt werden können. Klammern können jedoch für andere Siegel nützlich sein, wie wir im nächsten Abschnitt sehen werden.

Elixir unterstützt Perl-kompatible Regexes und Modifikatoren. Weitere Informationen zur Verwendung von Regexen finden Sie hier .

Zeichenfolgen, Zeichenlisten und Wortlisten

Abgesehen von Regexen hat Elixir 3 weitere eingebaute Siegel. Schauen wir uns die Siegel an.

Saiten

Das Siegel ~ wird verwendet, um Zeichenfolgen zu generieren, wie dies bei doppelten Anführungszeichen der Fall ist. Das Siegel von ~ s ist beispielsweise nützlich, wenn eine Zeichenfolge sowohl doppelte als auch einfache Anführungszeichen enthält -

new_string = ~s(this is a string with "double" quotes, not 'single' ones)
IO.puts(new_string)

Dieses Siegel erzeugt Zeichenketten. Wenn das obige Programm ausgeführt wird, wird das folgende Ergebnis erzeugt:

"this is a string with \"double\" quotes, not 'single' ones"

Char Lists

Das ~ c-Siegel wird verwendet, um Zeichenlisten zu generieren -

new_char_list = ~c(this is a char list containing 'single quotes')
IO.puts(new_char_list)

Wenn das obige Programm ausgeführt wird, wird das folgende Ergebnis erzeugt:

this is a char list containing 'single quotes'

Wortlisten

Das ~ w-Siegel wird verwendet, um Wortlisten zu generieren (Wörter sind nur reguläre Zeichenfolgen). Innerhalb des Siegels werden Wörter durch Leerzeichen getrennt.

new_word_list = ~w(foo bar bat)
IO.puts(new_word_list)

Wenn das obige Programm ausgeführt wird, wird das folgende Ergebnis erzeugt:

foobarbat

Das Siegel akzeptiert auch das c, s und a Modifikatoren (für Zeichenlisten, Zeichenfolgen bzw. Atome), die den Datentyp der Elemente der resultierenden Liste angeben -

new_atom_list = ~w(foo bar bat)a
IO.puts(new_atom_list)

Wenn das obige Programm ausgeführt wird, wird das folgende Ergebnis erzeugt:

[:foo, :bar, :bat]

Interpolation und Flucht in Siegel

Neben Siegel in Kleinbuchstaben unterstützt Elixir Siegel in Großbuchstaben, um mit Escapezeichen und Interpolation umzugehen. Während sowohl ~ s als auch ~ S Zeichenfolgen zurückgeben, erlaubt Ersteres Escape-Codes und Interpolation, während Letzteres dies nicht tut. Betrachten wir ein Beispiel, um dies zu verstehen -

~s(String with escape codes \x26 #{"inter" <> "polation"})
# "String with escape codes & interpolation"
~S(String without escape codes \x26 without #{interpolation})
# "String without escape codes \\x26 without \#{interpolation}"

Benutzerdefinierte Siegel

Wir können leicht unsere eigenen Siegel erstellen. In diesem Beispiel erstellen wir ein Siegel, um eine Zeichenfolge in Großbuchstaben umzuwandeln.

defmodule CustomSigil do
   def sigil_u(string, []), do: String.upcase(string)
end

import CustomSigil

IO.puts(~u/tutorials point/)

Wenn wir den obigen Code ausführen, wird das folgende Ergebnis erzeugt:

TUTORIALS POINT

Zuerst definieren wir ein Modul namens CustomSigil und innerhalb dieses Moduls haben wir eine Funktion namens sigil_u erstellt. Da im vorhandenen Siegelraum kein Siegel vorhanden ist, werden wir es verwenden. Das _u zeigt an, dass wir u als Zeichen nach der Tilde verwenden möchten. Die Funktionsdefinition muss zwei Argumente enthalten, eine Eingabe und eine Liste.