¿Cuál es la diferencia entre use
y import
?
El uso es un mecanismo simple para usar un módulo dado en el contexto actual
https://hexdocs.pm/elixir/Kernel.SpecialForms.html#import/2
Importa funciones y macros de otros módulos
Parece que una diferencia es import
que le permite elegir las funciones / macros específicas, mientras que use
trae todo adentro.
¿Hay otras diferencias? ¿Cuándo usarías uno sobre el otro?
import Module
trae funciones para ser utilizadas dentro de su módulo.use Module
trae funciones para ser utilizadas Y las expone públicamente en su móduloRespuestas:
import Module
trae todas las funciones y macros deModule
espacios sin nombre a su módulo.require Module
le permite usar macros deModule
pero no las importa. (Las funciones deModule
siempre están disponibles en espacios de nombres).use Module
primerrequires
módulo y luego llama a la__using__
macroModule
.Considera lo siguiente:
Esto no se compilará ya que
ModA.moda()
no se ha importadoModB
.Sin embargo, se compilará lo siguiente:
Al igual que cuando
use
DModA
se genera unimport
comunicado que se insertó enModB
.fuente
*.ex
archivos ydefmodule
bloques, y cómo extraería un módulo de un archivo a un iex REPL__using__
método se ejecuta enuse ModA
? Probablemente tendría sentido usar importModB
en el ejemplo que ha presentado, ¿correcto?use
está destinado a inyectar código en el módulo actual, mientras queimport
se usa, bueno, para importar funciones para su uso. Puede construir unause
implementación que importe automáticamente funciones, por ejemplo, como hago con Timex cuando agregause Timex
a un módulo, eche un vistazo a timex.ex si desea saber a qué me refiero , es un ejemplo muy simple de cómo construir un módulo que puede seruse
'dfuente
use
es más general queimport
? Es decir, la funcionalidad deimport
es un subconjunto deuse
import
sigue siendo necesario, ya que no sé si es exacto decir que se puede volverimport
a implementaruse
solo, pero no me sorprendería si fuera posible.use
es absolutamente más poderoso sin embargo. Puede hacer cosas muy complejas con él, por ejemplo, hago un uso intensivo deuse
miexprotobuf
proyecto que puede consultar si desea verlo llevado al límite. Puede extender módulos con código, ejecutar código en tiempo de compilación, agregar funciones a un módulo, etc. Básicamente combinaimport
y el poder de las macros.use
). Definitivamente será más fácil leerlo para un principiante queexprotobuf
, pero creo que probablemente llegouse
a su límite, porexprotobuf
lo que podría ser útil solo para ver hasta dónde puede llegar.use
en realidad no hace mucho, solo llama__using__
al módulo especificado.Consulte la página «alias, requerir e importar» de la guía de inicio oficial de elixir:
Exigir
Elixir proporciona macros como mecanismo para la metaprogramación (escribir código que genera código).
Las macros son fragmentos de código que se ejecutan y expanden en el momento de la compilación. Esto significa que, para usar una macro, debemos garantizar que su módulo y su implementación estén disponibles durante la compilación. Esto se hace con la
require
directiva.En general, no es necesario un módulo antes de su uso, excepto si queremos usar las macros disponibles en ese módulo.
Importar
Usamos
import
cuando queremos acceder fácilmente a funciones o macros desde otros módulos sin usar el nombre completo. Por ejemplo, si queremos usar laduplicate/2
función delList
módulo varias veces, podemos importarla:En este caso, estamos importando solo la función
duplicate
(con arity 2) deList
.Tenga en cuenta que
import
un módulo lo envía automáticamenterequire
.Utilizar
Aunque no es una directiva,
use
es una macro estrechamente relacionadarequire
que le permite utilizar un módulo en el contexto actual. Losuse
desarrolladores utilizan con frecuencia la macro para llevar la funcionalidad externa al ámbito léxico actual, a menudo módulos.Detrás de escena,
use
requiere el módulo dado y luego llama a la__using__/1
devolución de llamada, lo que permite que el módulo inyecte algo de código en el contexto actual. En general, el siguiente módulo:se compila en
fuente
Con antecedentes de los lenguajes Python / Java / Golang, el
import
vsuse
también estaba confundido para mí. Esto explicará el mecanismo de reutilización de código con algunos ejemplos de lenguajes declarativos.importar
En resumen, en Elixir, no necesita importar módulos. Se puede acceder a todas las funciones públicas mediante la sintaxis MODULE.FUNCTION completa:
En Python / Java / Golang, debe hacerlo
import MODULE
antes de poder usar funciones en ese MÓDULO, por ejemplo, PythonEntonces, lo que hace
import
en Elixir puede sorprenderte:https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Entonces, si desea escribir en
sqrt
lugar deInteger.sqrt
, entrim
lugar deString.trim
,import
ayudaráEsto puede causar problemas para leer el código y cuando hay un conflicto de nombres, por lo que no se recomienda en Erlang (el idioma que influye en Elixir). Pero no existe tal convención en Elixir, puede usarla bajo su propio riesgo.
En Python, el mismo efecto se puede hacer al:
y solo se recomienda usar en algunos escenarios especiales / modo interactivo, para una escritura más corta / más rápida.
usar y requerir
Lo que hace
use
/require
diferente es que se relacionan con "macro", el concepto que no existe en Python / Java / Golang ... family.No necesita
import
un módulo para usar sus funciones, pero necesitarequire
un módulo para usar sus macros :Aunque
is_even
puede escribirse como una función normal, es una macro porque:https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use
, para extraer de Elixir doc:se compila en
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Entonces escribir
use X
es lo mismo que escribiruse/2
es una macro , la macro transformará el código en otro código para usted.Querrás
use MODULE
cuando:require
)MODULE.__using__()
Probado en Elixir 1.5
fuente
use Module
requiereModule
y también lo llama__using__
.import Module
trae laModule
funcionalidad al contexto actual , no solo la requiere.fuente
Importar
Hace que todas las funciones y macros de un módulo dado sean accesibles dentro del ámbito léxico donde se llama. Tenga en cuenta que en la mayoría de los casos solo necesita importar una o más funciones / macros.
Ejemplo:
Utilizar
Esta macro le permite inyectar cualquier código en el módulo actual. Debe tener cuidado al usar bibliotecas externas con
use
, ya que es posible que no esté seguro de lo que sucede exactamente detrás de escena.Ejemplo:
Detrás de la escena, el código dentro de
__using__
ha sido inyectado en elTextPrinter
módulo.Por cierto, hay más instrucciones de manejo de dependencias en Elixir .
fuente