Elixier - Aliase

Um die Wiederverwendung von Software zu erleichtern, bietet Elixir drei Anweisungen: alias, require und import. Es bietet auch ein Makro namens use, das unten zusammengefasst ist -

# Alias the module so it can be called as Bar instead of Foo.Bar
alias Foo.Bar, as: Bar

# Ensure the module is compiled and available (usually for macros)
require Foo

# Import functions from Foo so they can be called without the `Foo.` prefix
import Foo

# Invokes the custom code defined in Foo as an extension point
use Foo

Lassen Sie uns nun jede Richtlinie im Detail verstehen.

alias

Mit der Alias-Direktive können Sie Aliase für einen bestimmten Modulnamen einrichten. Zum Beispiel, wenn Sie einen Alias ​​angeben möchten'Str' In das String-Modul können Sie einfach schreiben -

alias String, as: Str
IO.puts(Str.length("Hello"))

Das obige Programm generiert das folgende Ergebnis:

5

Ein Alias ​​wird dem gegeben String Modul als Str. Wenn wir nun eine Funktion mit dem Str-Literal aufrufen, verweist sie tatsächlich auf dasStringModul. Dies ist sehr hilfreich, wenn wir sehr lange Modulnamen verwenden und diese im aktuellen Bereich durch kürzere ersetzen möchten.

NOTE - Aliase MUST Beginnen Sie mit einem Großbuchstaben.

Aliase sind nur innerhalb der gültig lexical scope Sie werden aufgerufen. Wenn Sie beispielsweise zwei Module in einer Datei haben und einen Alias ​​in einem der Module erstellen, kann auf diesen Alias ​​im zweiten Modul nicht zugegriffen werden.

Wenn Sie den Namen eines eingebauten Moduls wie String oder Tuple als Alias ​​für ein anderes Modul angeben, um auf das eingebaute Modul zuzugreifen, müssen Sie ihm ein vorangestelltes Modul hinzufügen "Elixir.". Zum Beispiel,

alias List, as: String
#Now when we use String we are actually using List.
#To use the string module: 
IO.puts(Elixir.String.length("Hello"))

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

5

benötigen

Elixir bietet Makros als Mechanismus für die Metaprogrammierung (Schreiben von Code, der Code generiert).

Makros sind Codestücke, die zur Kompilierungszeit ausgeführt und erweitert werden. Das heißt, um ein Makro verwenden zu können, müssen wir sicherstellen, dass sein Modul und seine Implementierung während der Kompilierung verfügbar sind. Dies geschieht mit demrequire Richtlinie.

Integer.is_odd(3)

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

** (CompileError) iex:1: you must require Integer before invoking the macro Integer.is_odd/1

In Elixir, Integer.is_odd ist definiert als macro. Dieses Makro kann als Schutz verwendet werden. Dies bedeutet, dass, um aufzurufenInteger.is_oddbenötigen wir das Integer-Modul.

Verwenden Sie die require Integer Funktion und führen Sie das Programm wie unten gezeigt aus.

require Integer
Integer.is_odd(3)

Dieses Mal wird das Programm ausgeführt und die Ausgabe wie folgt erzeugt: true.

Im Allgemeinen ist ein Modul vor der Verwendung nicht erforderlich, es sei denn, wir möchten die in diesem Modul verfügbaren Makros verwenden. Ein Versuch, ein Makro aufzurufen, das nicht geladen wurde, führt zu einem Fehler. Beachten Sie, dass require wie die Alias-Direktive auch lexikalisch gültig ist . Wir werden in einem späteren Kapitel mehr über Makros sprechen.

importieren

Wir nehmen das importAnweisung zum einfachen Zugriff auf Funktionen oder Makros von anderen Modulen ohne Verwendung des vollständig qualifizierten Namens. Zum Beispiel, wenn wir die verwenden möchtenduplicate Funktion aus dem List-Modul mehrmals, können wir es einfach importieren.

import List, only: [duplicate: 2]

In diesem Fall importieren wir nur das Funktionsduplikat (mit Argumentlistenlänge 2) aus List. Obwohl:only ist optional, wird die Verwendung empfohlen, um zu vermeiden, dass alle Funktionen eines bestimmten Moduls in den Namespace importiert werden. :except kann auch als Option angegeben werden, um alles in ein Modul außer einer Liste von Funktionen zu importieren.

Das import Richtlinie unterstützt auch :macros und :functions gegeben werden :only. Um beispielsweise alle Makros zu importieren, kann ein Benutzer schreiben:

import Integer, only: :macros

Beachten Sie, dass auch der Import ist Lexically scopedgenau wie die Direktiven require und alias. Beachten Sie auch das'import'ing a module also 'require's it.

verwenden

Obwohl keine Richtlinie, use ist ein Makro, das eng mit verwandt ist requireDamit können Sie ein Modul im aktuellen Kontext verwenden. Das Verwendungsmakro wird häufig von Entwicklern verwendet, um externe Funktionen in den aktuellen lexikalischen Bereich zu integrieren, häufig Module. Lassen Sie uns die Verwendungsrichtlinie anhand eines Beispiels verstehen -

defmodule Example do 
   use Feature, option: :value 
end

Use ist ein Makro, das das Obige in - umwandelt.

defmodule Example do
   require Feature
   Feature.__using__(option: :value)
end

Das use Module benötigt zuerst das Modul und ruft dann das auf __using__Makro auf Modul. Elixir verfügt über hervorragende Metaprogrammierungsfunktionen und Makros zum Generieren von Code zur Kompilierungszeit. Das Makro _ _using__ wird in der obigen Instanz aufgerufen, und der Code wird in unseren lokalen Kontext eingefügt . Im lokalen Kontext wurde das Verwendungsmakro zum Zeitpunkt der Kompilierung aufgerufen.