¿Cuál es la diferencia entre usey 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 importque le permite elegir las funciones / macros específicas, mientras que usetrae todo adentro.
¿Hay otras diferencias? ¿Cuándo usarías uno sobre el otro?

import Moduletrae funciones para ser utilizadas dentro de su módulo.use Moduletrae funciones para ser utilizadas Y las expone públicamente en su móduloRespuestas:
import Moduletrae todas las funciones y macros deModuleespacios sin nombre a su módulo.require Modulele permite usar macros deModulepero no las importa. (Las funciones deModulesiempre están disponibles en espacios de nombres).use Moduleprimerrequiresmó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
useDModAse genera unimportcomunicado que se insertó enModB.fuente
*.exarchivos ydefmodulebloques, 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 importModBen el ejemplo que ha presentado, ¿correcto?useestá destinado a inyectar código en el módulo actual, mientras queimportse usa, bueno, para importar funciones para su uso. Puede construir unauseimplementación que importe automáticamente funciones, por ejemplo, como hago con Timex cuando agregause Timexa 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
usees más general queimport? Es decir, la funcionalidad deimportes un subconjunto deuseimportsigue siendo necesario, ya que no sé si es exacto decir que se puede volverimporta implementarusesolo, pero no me sorprendería si fuera posible.usees absolutamente más poderoso sin embargo. Puede hacer cosas muy complejas con él, por ejemplo, hago un uso intensivo deusemiexprotobufproyecto 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 combinaimporty el poder de las macros.use). Definitivamente será más fácil leerlo para un principiante queexprotobuf, pero creo que probablemente llegousea su límite, porexprotobuflo que podría ser útil solo para ver hasta dónde puede llegar.useen 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
requiredirectiva.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
importcuando queremos acceder fácilmente a funciones o macros desde otros módulos sin usar el nombre completo. Por ejemplo, si queremos usar laduplicate/2función delListmódulo varias veces, podemos importarla:En este caso, estamos importando solo la función
duplicate(con arity 2) deList.Tenga en cuenta que
importun módulo lo envía automáticamenterequire.Utilizar
Aunque no es una directiva,
usees una macro estrechamente relacionadarequireque le permite utilizar un módulo en el contexto actual. Losusedesarrolladores utilizan con frecuencia la macro para llevar la funcionalidad externa al ámbito léxico actual, a menudo módulos.Detrás de escena,
userequiere el módulo dado y luego llama a la__using__/1devolució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
importvsusetambié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 MODULEantes de poder usar funciones en ese MÓDULO, por ejemplo, PythonEntonces, lo que hace
importen Elixir puede sorprenderte:https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Entonces, si desea escribir en
sqrtlugar deInteger.sqrt, entrimlugar deString.trim,importayudará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/requirediferente es que se relacionan con "macro", el concepto que no existe en Python / Java / Golang ... family.No necesita
importun módulo para usar sus funciones, pero necesitarequireun módulo para usar sus macros :Aunque
is_evenpuede 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 Xes lo mismo que escribiruse/2es una macro , la macro transformará el código en otro código para usted.Querrás
use MODULEcuando:require)MODULE.__using__()Probado en Elixir 1.5
fuente
use ModulerequiereModuley también lo llama__using__.import Moduletrae laModulefuncionalidad 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 elTextPrintermódulo.Por cierto, hay más instrucciones de manejo de dependencias en Elixir .
fuente