Was ist der Unterschied zwischen use
und import
?
use ist ein einfacher Mechanismus, um ein bestimmtes Modul im aktuellen Kontext zu verwenden
https://hexdocs.pm/elixir/Kernel.SpecialForms.html#import/2
Importiert Funktionen und Makros aus anderen Modulen
Ein Unterschied besteht darin, import
dass Sie die spezifischen Funktionen / Makros auswählen und use
alles einbringen.
Gibt es noch andere Unterschiede? Wann würden Sie eins über das andere verwenden?
import Module
Bringt Funktionen ein, die in Ihrem Modul verwendet werden können.use Module
bringt Funktionen zur Verwendung und macht sie öffentlich auf Ihrem ModulAntworten:
import Module
Bringt alle Funktionen und Makros von Namen ohne NamenModule
in Ihr Modul.require Module
Ermöglicht die Verwendung von Makros vonModule
, importiert diese jedoch nicht. (Funktionen vonModule
sind immer im Namespace verfügbar.)use Module
erstesrequires
Modul und ruft dann das__using__
Makro aufModule
.Folgendes berücksichtigen:
Dies wird nicht kompiliert, da
ModA.moda()
es nicht importiert wurdeModB
.Folgendes wird jedoch kompiliert:
Wie , wenn Sie
use
dModA
es erzeugt eineimport
Anweisung , die in eingefügt wurdeModB
.quelle
*.ex
Dateien unddefmodule
Blöcke sind und wie Sie ein Modul aus einer Datei in einen IEX ziehen würden. REPL__using__
Methode ausgeführt wirduse ModA
? Es wäre wahrscheinlich sinnvoll, nur den ImportModB
in dem Beispiel zu verwenden, das Sie richtig dargestellt haben.use
ist zum Einfügen von Code in das aktuelle Modul vorgesehen, währendimport
Funktionen zum Verwenden importiert werden. Sie können eineuse
Implementierung erstellen , die Funktionen automatisch importiert, wie ich es beispielsweise mit Timex beim Hinzufügenuse Timex
zu einem Modul tue. Schauen Sie sich timex.ex an, wenn Sie wissen möchten, was ich meine . Es ist ein sehr einfaches Beispiel für das Erstellen einer Modul, dasuse
'd sein kannquelle
use
es allgemeiner ist alsimport
? Das heißt, die Funktionalität vonimport
ist eine Teilmenge vonuse
import
notwendig ist , noch, wie ich weiß nicht , ob es richtig ist , Sie reimplementieren können zu sagen ,import
mituse
allein, aber ich wäre nicht überrascht, wenn es möglich ist.use
ist aber absolut mächtiger. Sie können damit sehr komplexe Dinge tun, zum Beispiel verwende ichuse
in meinemexprotobuf
Projekt viel davon, was Sie überprüfen können, wenn Sie möchten, dass es an seine Grenzen stößt. Sie können Module mit Code erweitern, Code zur Kompilierungszeit ausführen, einem Modul Funktionen hinzufügen usw. Grundsätzlich werdenimport
Makros kombiniert und die Leistung von Makros.use
). Es ist fast definitiv einfacher für Anfänger durchzulesen alsexprotobuf
, aber ich denke, ich gehe wahrscheinlichuse
an seine Grenzen,exprotobuf
so dass es nützlich sein könnte, nur um zu sehen, wie weit man es bringen kann.use
macht eigentlich nicht viel, es ruft nur__using__
das angegebene Modul auf.Siehe die Seite «Alias, erforderlich und importieren» in der offiziellen Anleitung für den Einstieg in das Elixier:
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 der
require
Richtlinie.Im Allgemeinen muss ein Modul vor der Verwendung nicht benötigt werden, es sei denn, wir möchten die in diesem Modul verfügbaren Makros verwenden.
Importieren
Wir verwenden,
import
wann immer wir einfach auf Funktionen oder Makros von anderen Modulen zugreifen möchten, ohne den vollständig qualifizierten Namen zu verwenden. Wenn wir beispielsweise dieduplicate/2
Funktion aus demList
Modul mehrmals verwenden möchten , können wir sie importieren:In diesem Fall importieren wir nur die Funktion
duplicate
(mit Arität 2) ausList
.Beachten Sie, dass
import
ein Modul automatischrequire
aktiviert wird.Verwenden
Obwohl es sich nicht um eine Direktive handelt,
use
ist ein Makro eng damit verbunden,require
sodass Sie ein Modul im aktuellen Kontext verwenden können. Dasuse
Makro wird häufig von Entwicklern verwendet, um externe Funktionen in den aktuellen lexikalischen Bereich zu integrieren, häufig Module.Benötigt hinter den Kulissen
use
das angegebene Modul und ruft dann den__using__/1
Rückruf auf, damit das Modul Code in den aktuellen Kontext einfügen kann. Generell folgendes Modul:wird kompiliert in
quelle
Mit Hintergrund aus Python / Java / Golang-Sprachen war das
import
vsuse
auch für mich verwirrt. Dies erklärt den Mechanismus der Wiederverwendung von Code anhand einiger Beispiele für deklarative Sprachen.importieren
Kurz gesagt, in Elixir müssen Sie keine Module importieren. Auf alle öffentlichen Funktionen kann mit der vollqualifizierten Syntax MODULE.FUNCTION zugegriffen werden:
In Python / Java / Golang müssen Sie,
import MODULE
bevor Sie Funktionen in diesem MODUL verwenden können, z. B. PythonWas
import
in Elixir dann tut, könnte Sie überraschen:https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Also , wenn Sie möchten , geben Sie
sqrt
stattInteger.sqrt
,trim
stattString.trim
,import
wird dazu beitragen ,Dies kann zu Problemen beim Lesen von Code führen und wenn es zu Namenskonflikten kommt, wird dies in Erlang (der Sprache, die Elixir beeinflusst) nicht empfohlen . Aber es gibt keine solche Konvention in Elixir, Sie können sie auf eigenes Risiko verwenden.
In Python kann der gleiche Effekt erzielt werden durch:
und es wird nur empfohlen, in einigen speziellen Szenarien / im interaktiven Modus zu verwenden - für kürzeres / schnelleres Tippen.
verwenden & benötigen
Was macht
use
/require
unterscheidet ist, dass sie sich auf "Makro" beziehen - das Konzept, das es in der Python / Java / Golang ... -Familie nicht gibt.Sie benötigen kein
import
Modul, um seine Funktionen zu verwenden, aber Sie benötigenrequire
ein Modul, um seine Makros zu verwenden :Obwohl
is_even
es als normale Funktion geschrieben werden kann, ist es ein Makro, weil:https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use
, Auszug aus Elixir doc:wird kompiliert in
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Schreiben
use X
ist also dasselbe wie Schreibenuse/2
ist ein Makro , Makro wandelt Code in anderen Code für Sie um.Sie werden wollen,
use MODULE
wenn Sie:require
)MODULE.__using__()
Getestet mit Elixir 1.5
quelle
use Module
erfordertModule
und ruft__using__
es auch auf.import Module
bringtModule
Funktionalität in den aktuellen Kontext , erfordert sie nicht nur.quelle
Importieren
Macht alle Funktionen und Makros eines bestimmten Moduls innerhalb des lexikalischen Bereichs zugänglich, in dem es aufgerufen wird. Beachten Sie, dass in den meisten Fällen nur eine oder mehrere Funktionen / Makros importiert werden müssen.
Beispiel:
Verwenden
Mit diesem Makro können Sie beliebigen Code in das aktuelle Modul einfügen. Sie sollten vorsichtig sein, wenn Sie externe Bibliotheken mit verwenden
use
, da Sie möglicherweise nicht sicher sind, was genau hinter den Kulissen passiert.Beispiel:
Hinter den Kulissen wurde Code
__using__
in dasTextPrinter
Modul eingefügt.Übrigens gibt es in Elixir mehr Anweisungen zur Behandlung von Abhängigkeiten .
quelle