Con antecedentes de los lenguajes Python / Java / Golang, el import
vs use
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:
iex()> Integer.mod(5, 2)
1
iex()> String.trim(" Hello Elixir ")
"Hello Elixir"
En Python / Java / Golang, debe hacerlo import MODULE
antes 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 import
en 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 sqrt
lugar de Integer.sqrt
, en trim
lugar de String.trim
, import
ayudará
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
/ 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 necesita require
un 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_even
puede 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__/1
devolució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 X
es 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 MODULE
cuando:
- desea acceder a sus macros (
require
)
- Y ejecutar
MODULE.__using__()
Probado en Elixir 1.5
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ódulo