Mając tło z języków Python / Java / Golang, importvs usebył dla mnie zdezorientowany. To wyjaśni mechanizm ponownego użycia kodu z kilkoma przykładami języków deklaratywnych.
import
Krótko mówiąc, w Elixirze nie musisz importować modułów. Dostęp do wszystkich funkcji publicznych można uzyskać poprzez w pełni kwalifikowany MODUŁ. Składnia FUNKCJI:
iex()> Integer.mod(5, 2)
1
iex()> String.trim(" Hello Elixir ")
"Hello Elixir"
W Python / Java / Golang musisz to zrobić import MODULEzanim będziesz mógł używać funkcji w tym MODULE, np. Python
In []: import math
In []: math.sqrt(100)
Out[]: 10.0
W takim razie to, co importrobi Elixir, może Cię zaskoczyć:
Korzystamy z importu, gdy chcemy mieć łatwy dostęp do funkcji lub makr z innych modułów bez używania w pełni kwalifikowanej nazwy
https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Więc jeśli chcesz pisać sqrtzamiast Integer.sqrt, trimzamiast String.trim, importpomoże
iex()> import Integer
Integer
iex()> sqrt(100)
10.0
iex()> import String
String
iex()> trim(" Hello Elixir ")
"Hello Elixir"
Może to powodować problemy z czytaniem kodu i konfliktami nazw, więc nie jest to zalecane w Erlangu (języku, który ma wpływ na Elixir). Ale w Elixirze nie ma takiej konwencji, możesz z niej korzystać na własne ryzyko.
W Pythonie ten sam efekt można osiągnąć poprzez:
from math import *
i zaleca się używać go tylko w niektórych specjalnych scenariuszach / trybie interaktywnym - do krótszego / szybszego pisania.
użyj i wymagaj
Co sprawia, use/ requireinna jest to, że odnoszą się one do „makro” - pojęcie, które nie istnieje w Python / Java / Golang ... rodziny.
Nie potrzebujesz importmodułu, aby korzystać z jego funkcji, ale potrzebujesz requiremodułu, aby używać jego makr :
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
Chociaż is_evenmożna go zapisać jako normalną funkcję, jest to makro, ponieważ:
W Elixirze Integer.is_odd / 1 jest zdefiniowane jako makro, dzięki czemu może być używane jako ochrona.
https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use, fragment z dokumentu Elixir:
use wymaga danego modułu, a następnie wywołuje __using__/1wywołanie zwrotne, pozwalając modułowi na wstrzyknięcie kodu do bieżącego kontekstu.
defmodule Example do
use Feature, option: :value
end
jest wkompilowany w
defmodule Example do
require Feature
Feature.__using__(option: :value)
end
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Więc pisanie use Xjest tym samym, co pisanie
require X
X.__using__()
use/2 jest makrem , makro przekształci kod na inny kod za Ciebie.
Będziesz chciał, use MODULEgdy:
- chce uzyskać dostęp do jego makr (
require)
- I wykonaj
MODULE.__using__()
Testowane na Elixirze 1.5
import Modulezawiera funkcje do wykorzystania w module.use Modulewprowadza funkcje do użycia ORAZ ujawnia je publicznie w Twoim module