Con lo sfondo dalle lingue Python / Java / Golang, anche il import
vs è use
stato confuso per me. Questo spiegherà il meccanismo di riutilizzo del codice con alcuni esempi di linguaggi dichiarativi.
importare
In breve, in Elisir, non è necessario importare moduli. Tutte le funzioni pubbliche sono accessibili dalla sintassi MODULE.FUNCTION completa:
iex()> Integer.mod(5, 2)
1
iex()> String.trim(" Hello Elixir ")
"Hello Elixir"
In Python / Java / Golang, è necessario import MODULE
prima di poter utilizzare le funzioni in quel MODULO, ad esempio Python
In []: import math
In []: math.sqrt(100)
Out[]: 10.0
Quindi ciò che import
fa Elisir potrebbe sorprenderti:
Usiamo import ogni volta che vogliamo accedere facilmente a funzioni o macro da altri moduli senza usare il nome completo
https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Quindi, se si desidera digitare sqrt
anziché Integer.sqrt
, trim
anziché String.trim
, import
sarà di aiuto
iex()> import Integer
Integer
iex()> sqrt(100)
10.0
iex()> import String
String
iex()> trim(" Hello Elixir ")
"Hello Elixir"
Ciò potrebbe causare problemi nella lettura del codice e in caso di conflitto di nomi, quindi non è raccomandato in Erlang (la lingua che influenza l'Elisir). Ma non esiste una convenzione del genere in Elisir, puoi usarlo a proprio rischio.
In Python, lo stesso effetto può essere fatto da:
from math import *
e si consigliava di utilizzare solo in alcuni scenari speciali / modalità interattiva - per una digitazione più breve / più veloce.
usare e richiedere
Ciò che rende use
/ require
diverso è che si riferiscono alla "macro" - il concetto che non esiste nella famiglia Python / Java / Golang ...
Non è necessario che import
un modulo utilizzi le sue funzioni, ma è necessario che require
un modulo utilizzi le sue macro :
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
Sebbene is_even
possa essere scritto come una normale funzione, è una macro perché:
In Elisir, Integer.is_odd / 1 è definito come una macro in modo che possa essere usato come guardia.
https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use
, per estrarre dal documento Elisir:
use richiede il modulo dato e quindi chiama il __using__/1
callback su di esso consentendo al modulo di iniettare del codice nel contesto corrente.
defmodule Example do
use Feature, option: :value
end
è compilato in
defmodule Example do
require Feature
Feature.__using__(option: :value)
end
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Quindi scrivere use X
è come scrivere
require X
X.__using__()
use/2
è una macro , la macro trasformerà il codice in un altro codice per te.
Lo vorrai use MODULE
quando:
- vuoi accedere alle sue macro (
require
)
- E eseguire
MODULE.__using__()
Testato su Elisir 1.5
import Module
introduce le funzioni da utilizzare all'interno del modulo.use Module
porta le funzioni da usare E le espone pubblicamente sul tuo modulo