Mając tło z języków Python / Java / Golang, import
vs use
był 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 MODULE
zanim 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 import
robi 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ć sqrt
zamiast Integer.sqrt
, trim
zamiast String.trim
, import
pomoż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
/ require
inna jest to, że odnoszą się one do „makro” - pojęcie, które nie istnieje w Python / Java / Golang ... rodziny.
Nie potrzebujesz import
modułu, aby korzystać z jego funkcji, ale potrzebujesz require
moduł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_even
moż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__/1
wywoł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 X
jest 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 MODULE
gdy:
- chce uzyskać dostęp do jego makr (
require
)
- I wykonaj
MODULE.__using__()
Testowane na Elixirze 1.5
import Module
zawiera funkcje do wykorzystania w module.use Module
wprowadza funkcje do użycia ORAZ ujawnia je publicznie w Twoim module