Quelle est la différence entre use
et import
?
use est un mécanisme simple pour utiliser un module donné dans le contexte actuel
https://hexdocs.pm/elixir/Kernel.SpecialForms.html#import/2
Importe la fonction et les macros d'autres modules
Il semble qu'une différence soit import
que vous sélectionniez les fonctions / macros spécifiques use
tout en apportant tout.
Y a-t-il d'autres différences? Quand utiliseriez-vous l'un sur l'autre?
import Module
apporte des fonctions à utiliser dans votre module.use Module
apporte des fonctions à utiliser ET les expose publiquement sur votre moduleRéponses:
import Module
apporte toutes les fonctions et macros deModule
un-namespaced dans votre module.require Module
vous permet d'utiliser des macrosModule
mais ne les importe pas. (Les fonctions deModule
sont toujours disponibles avec un espace de noms.)use Module
premierrequires
module, puis appelle la__using__
macroModule
.Considérer ce qui suit:
Cela ne sera pas compilé car il
ModA.moda()
n'a pas été importé dansModB
.Ce qui suit va cependant compiler:
Comme lorsque vous
use
as-ModA
il produit uneimport
déclaration qui a été inséré dansModB
.la source
*.ex
fichiers et desdefmodule
blocs, et comment vous tireriez un module d'un fichier dans un iex REPL__using__
méthode est exécutée suruse ModA
? Il serait probablement judicieux d'utiliser simplement l'importationModB
dans l'exemple que vous avez présenté, correct?use
est destiné à injecter du code dans le module actuel, alors qu'ilimport
est utilisé pour importer des fonctions à utiliser. Vous pouvez créer uneuse
implémentation qui importe automatiquement des fonctions par exemple, comme je le fais avec Timex lorsque vous ajoutezuse Timex
à un module, jetez un œil à timex.ex si vous voulez savoir ce que je veux dire , c'est un exemple très simple de comment construire un module qui peut êtreuse
'dla source
use
c'est plus général queimport
? Autrement dit, la fonctionnalité deimport
est un sous-ensemble deuse
import
est encore nécessaire, car je ne sais pas s'il est exact de dire que vous pouvez ré - écrireimport
avecuse
seul, mais je ne serais pas surpris si cela est possible.use
est absolument plus puissant cependant. Vous pouvez faire des choses très complexes avec, par exemple, je l'utilise beaucoupuse
dans monexprotobuf
projet que vous pouvez vérifier si vous voulez le voir poussé à ses limites. Vous pouvez étendre des modules avec du code, exécuter du code à la compilation, ajouter des fonctions à un module, etc. Fondamentalement, il combineimport
et la puissance des macros.use
). C'est presque certainement plus facile à lire pour un débutant queexprotobuf
, mais je pense que je pousse probablementuse
à sa limite,exprotobuf
donc il pourrait être utile de voir jusqu'où vous pouvez aller.use
en fait ne fait pas grand-chose, il appelle simplement__using__
le module spécifié.Voir la page «alias, require et import» du guide de démarrage officiel elixir:
Exiger
Elixir fournit des macros comme mécanisme de méta-programmation (écriture de code qui génère du code).
Les macros sont des morceaux de code qui sont exécutés et développés au moment de la compilation. Cela signifie que pour utiliser une macro, nous devons garantir que son module et son implémentation sont disponibles lors de la compilation. Cela se fait avec la
require
directive.En général, un module n'a pas besoin d'être requis avant l'utilisation, sauf si nous voulons utiliser les macros disponibles dans ce module.
Importer
Nous utilisons
import
chaque fois que nous voulons accéder facilement aux fonctions ou aux macros à partir d'autres modules sans utiliser le nom complet. Par exemple, si nous voulons utiliser laduplicate/2
fonction duList
module plusieurs fois, nous pouvons l'importer:Dans ce cas, nous importons uniquement la fonction
duplicate
(avec l'arité 2) deList
.Notez que
import
le module est automatiquement intégrérequire
.Utilisation
Bien que n'étant pas une directive,
use
est une macro étroitement liée àrequire
qui vous permet d'utiliser un module dans le contexte actuel. Lause
macro est fréquemment utilisée par les développeurs pour intégrer des fonctionnalités externes dans la portée lexicale actuelle, souvent des modules.Dans les coulisses,
use
nécessite le module donné, puis appelle le__using__/1
rappel sur celui-ci permettant au module d'injecter du code dans le contexte actuel. De manière générale, le module suivant:est compilé dans
la source
Avec l'expérience des langages Python / Java / Golang, le
import
vsuse
était également confus pour moi. Cela expliquera le mécanisme de réutilisation du code avec quelques exemples de langages déclaratifs.importer
En bref, dans Elixir, vous n'avez pas besoin d'importer de modules. Toutes les fonctions publiques sont accessibles par la syntaxe complète MODULE.FUNCTION:
En Python / Java / Golang, vous devez
import MODULE
avant de pouvoir utiliser des fonctions dans ce MODULE, par exemple PythonAlors ce que fait
import
Elixir pourrait vous surprendre:https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Donc, si vous voulez taper
sqrt
au lieu deInteger.sqrt
,trim
au lieu deString.trim
,import
cela vous aideraCela peut poser des problèmes pour la lecture du code et en cas de conflit de nom, ce n'est donc pas recommandé dans Erlang (le langage qui influence Elixir). Mais il n'y a pas de telle convention dans Elixir, vous pouvez l'utiliser à vos risques et périls.
En Python, le même effet peut être fait par:
et il n'est recommandé de l'utiliser que dans certains scénarios spéciaux / mode interactif - pour une saisie plus courte / plus rapide.
utiliser et exiger
Ce qui rend
use
/require
différent, c'est qu'ils se rapportent à "macro" - le concept qui n'existe pas dans la famille Python / Java / Golang ....Vous n'avez pas besoin d'
import
un module pour utiliser ses fonctions, mais vous avez besoin d'require
un module pour utiliser ses macros :Bien que cela
is_even
puisse être écrit comme une fonction normale, il s'agit d'une macro car:https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use
, extrait de Elixir doc:est compilé dans
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Donc l'écriture
use X
est la même chose que l'écritureuse/2
est une macro , la macro transformera le code en un autre code pour vous.Vous voudrez
use MODULE
quand vous:require
)MODULE.__using__()
Testé sur Elixir 1.5
la source
use Module
exigeModule
et fait également appel__using__
à lui.import Module
apporte laModule
fonctionnalité dans le contexte actuel , pas seulement l'exige.la source
Importer
Rend toutes les fonctions et macros d'un module donné accessibles à l'intérieur de la portée lexicale où il est appelé. Gardez à l'esprit que dans la plupart des cas, vous n'avez besoin que d'une ou plusieurs fonctions / macros à importer.
Exemple:
Utilisation
Cette macro vous permet d'injecter n'importe quel code dans le module actuel. Vous devez être prudent lorsque vous utilisez des bibliothèques externes avec
use
, car vous ne savez peut-être pas ce qui se passe exactement dans les coulisses.Exemple:
Derrière la scène, le code à l'intérieur de
__using__
a été injecté dans leTextPrinter
module.À propos, il y a plus d'instructions de gestion des dépendances dans Elixir .
la source