Qual é a diferença entre use
e import
?
use é um mecanismo simples para usar um determinado módulo no contexto atual
https://hexdocs.pm/elixir/Kernel.SpecialForms.html#import/2
Importa funções e macros de outros módulos
Parece que uma diferença é import
escolher as funções / macros específicas, enquanto use
traz tudo.
Existem outras diferenças? Quando você usaria um sobre o outro?
import Module
traz funções para serem usadas dentro do seu módulo.use Module
traz em funções a serem utilizados e os expõe publicamente seu móduloRespostas:
import Module
traz todas as funções e macros deModule
un-namespaced para o seu módulo.require Module
permite que você use macros,Module
mas não as importe. (As funções deModule
sempre estão disponíveis no namespace.)use Module
primeirorequires
módulo e, em seguida, chama a__using__
macroModule
.Considere o seguinte:
Isso não será compilado, pois
ModA.moda()
não foi importadoModB
.O seguinte será compilado:
Como quando você
use
dModA
gerou umaimport
declaração de que foi inseridoModB
.fonte
*.ex
arquivos e osdefmodule
blocos, e como você pode puxar um módulo a partir de um arquivo em um REPL IEX__using__
método é executadouse ModA
? Provavelmente faria sentido usar apenas a importação noModB
exemplo que você apresentou correto?use
destina-se a injetar código no módulo atual, enquantoimport
é usado para, bem, importar funções para uso. Você pode criar umause
implementação que importe automaticamente funções, por exemplo, como eu faço com o Timex quando você adicionause Timex
a um módulo, dê uma olhada no timex.ex se quiser saber o que quero dizer , é um exemplo muito simples de como criar um módulo que pode seruse
'dfonte
use
é mais geral do queimport
? Ou seja, a funcionalidade deimport
é um subconjunto deuse
import
ainda é necessário, como eu não sei se é correto dizer que você pode reimplementarimport
comuse
só, mas eu não ficaria surpreso se isso é possível.use
é absolutamente mais poderoso. Você pode fazer coisas muito complexas com isso, por exemplo, uso muitouse
no meuexprotobuf
projeto, que você pode conferir se quiser vê-lo ir ao limite. Você pode estender módulos com código, executar código em tempo de compilação, adicionar funções a um módulo, etc. Basicamente, ele combinaimport
e o poder das macros.use
). Definitivamente, é mais fácil ler para um iniciante do queexprotobuf
, mas acho que provavelmente vouuse
ao limiteexprotobuf
para que possa ser útil apenas para ver até onde você pode levá-lo.use
na verdade, não faz muito, apenas chama__using__
o módulo especificado.Consulte a página «alias, exija e importe» no guia de introdução oficial do elixir:
Exigir
O Elixir fornece macros como um mecanismo para metaprogramação (escrever código que gera código).
Macros são pedaços de código que são executados e expandidos no momento da compilação. Isso significa que, para usar uma macro, precisamos garantir que seu módulo e implementação estejam disponíveis durante a compilação. Isso é feito com a
require
diretiva.Em geral, um módulo não precisa ser necessário antes do uso, exceto se queremos usar as macros disponíveis nesse módulo.
Importar
Usamos
import
sempre que queremos acessar funções ou macros facilmente de outros módulos sem usar o nome completo. Por exemplo, se queremos usar aduplicate/2
função doList
módulo várias vezes, podemos importá-la:Nesse caso, estamos importando apenas a função
duplicate
(com arity 2) deList
.Observe que
import
um módulo o executa automaticamenterequire
.Usar
Embora não seja uma diretiva,
use
é uma macro fortemente relacionada arequire
isso que permite usar um módulo no contexto atual. Ause
macro é freqüentemente usada pelos desenvolvedores para trazer funcionalidade externa para o escopo lexical atual, geralmente módulos.Nos bastidores,
use
requer o módulo fornecido e, em seguida, chama o__using__/1
retorno de chamada, permitindo que o módulo injete algum código no contexto atual. De um modo geral, o seguinte módulo:é compilado em
fonte
Com experiência nas linguagens Python / Java / Golang, o
import
vsuse
também foi confuso para mim. Isso explicará o mecanismo de reutilização de código com alguns exemplos de linguagens declarativas.importar
Em resumo, no Elixir, você não precisa importar módulos. Todas as funções públicas podem ser acessadas pela sintaxe MODULE.FUNCTION totalmente qualificada:
Em Python / Java / Golang, você precisa
import MODULE
antes de poder usar funções nesse MODULE, por exemplo, PythonEntão, o que o
import
Elixir faz pode surpreendê-lo:https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Então, se você quiser digitar em
sqrt
vez deInteger.sqrt
, emtrim
vez deString.trim
,import
ajudaráIsso pode causar problemas na leitura do código e, quando houver conflito de nome, não é recomendado no Erlang (o idioma que influencia o Elixir). Mas não existe essa convenção no Elixir, você pode usá-lo por sua conta e risco.
No Python, o mesmo efeito pode ser feito por:
e recomenda-se usar apenas em alguns cenários especiais / modo interativo - para digitação mais curta / mais rápida.
use e exija
O que faz
use
/require
diferente é que eles se relacionam com "macro" - o conceito que não existe na família Python / Java / Golang ....Você não precisa de
import
um módulo para usar suas funções, mas precisa derequire
um módulo para usar suas macros :Embora
is_even
possa ser escrita como uma função normal, é uma macro porque:https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use
, para extrair do Elixir doc:é compilado em
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Então escrever
use X
é o mesmo que escreveruse/2
é uma macro , a macro transformará o código em outro código para você.Você vai querer
use MODULE
quando você:require
)MODULE.__using__()
Testado em Elixir 1.5
fonte
use Module
requerModule
e também solicita__using__
.import Module
trazModule
funcionalidade ao contexto atual , não apenas exige isso.fonte
Importar
Torna todas as funções e macros de um determinado módulo acessíveis dentro do escopo lexical onde é chamado. Lembre-se de que, na maioria dos casos, é necessário importar apenas uma ou mais funções / macros.
Exemplo:
Usar
Essa macro permite injetar qualquer código no módulo atual. Você deve ter cuidado ao usar bibliotecas externas
use
, pois pode não ter certeza do que exatamente acontece nos bastidores.Exemplo:
Nos bastidores, o código da cena
__using__
foi injetado noTextPrinter
módulo.A propósito, há mais instruções de manipulação de dependência no Elixir .
fonte