Con antecedentes de los lenguajes Python / Java / Golang, el importvs usetambié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:
iex()> Integer.mod(5, 2)
1
iex()> String.trim(" Hello Elixir ")
"Hello Elixir"
En Python / Java / Golang, debe hacerlo import MODULEantes de poder usar funciones en ese MÓDULO, por ejemplo, Python
In []: import math
In []: math.sqrt(100)
Out[]: 10.0
Entonces, lo que hace importen Elixir puede sorprenderte:
Usamos importar cuando queremos acceder fácilmente a funciones o macros desde otros módulos sin usar el nombre completo
https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Entonces, si desea escribir en sqrtlugar de Integer.sqrt, en trimlugar de String.trim, importayudará
iex()> import Integer
Integer
iex()> sqrt(100)
10.0
iex()> import String
String
iex()> trim(" Hello Elixir ")
"Hello Elixir"
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:
from math import *
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 necesita requireun módulo para usar sus macros :
iex()> Integer.mod(5, 3) # mod is a function
2
iex()> Integer.is_even(42)
** (CompileError) iex:3: you must require Integer before invoking the macro Integer.is_even/1
(elixir) src/elixir_dispatch.erl:97: :elixir_dispatch.dispatch_require/6
iex()> require Integer
Integer
iex()> Integer.is_even(42) # is_even is a macro
true
Aunque is_evenpuede escribirse como una función normal, es una macro porque:
En Elixir, Integer.is_odd / 1 se define como una macro para que pueda usarse como guardia.
https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use, para extraer de Elixir doc:
el uso requiere el módulo dado y luego llama a la __using__/1devolución de llamada en él permitiendo que el módulo inyecte algún código en el contexto actual.
defmodule Example do
use Feature, option: :value
end
se compila en
defmodule Example do
require Feature
Feature.__using__(option: :value)
end
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Entonces escribir use Xes lo mismo que escribir
require X
X.__using__()
use/2 es una macro , la macro transformará el código en otro código para usted.
Querrás use MODULEcuando:
- desea acceder a sus macros (
require)
- Y ejecutar
MODULE.__using__()
Probado en Elixir 1.5
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ódulo