Dengan latar belakang dari bahasa Python / Java / Golang, import
vs use
itu juga membingungkan bagi saya. Ini akan menjelaskan mekanisme penggunaan kembali kode dengan beberapa contoh bahasa deklaratif.
impor
Singkatnya, di Elixir, Anda tidak perlu mengimpor modul. Semua fungsi publik dapat diakses dengan sintaks MODULE.FUNCTION yang memenuhi syarat:
iex()> Integer.mod(5, 2)
1
iex()> String.trim(" Hello Elixir ")
"Hello Elixir"
Dalam Python / Java / Golang, Anda perlu import MODULE
sebelum Anda dapat menggunakan fungsi dalam MODULE itu, misalnya Python
In []: import math
In []: math.sqrt(100)
Out[]: 10.0
Lalu apa yang import
dilakukan Elixir mungkin mengejutkan Anda:
Kami menggunakan impor kapan pun kami ingin dengan mudah mengakses fungsi atau makro dari modul lain tanpa menggunakan nama yang sepenuhnya memenuhi syarat
https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Jadi jika Anda ingin mengetik sqrt
bukan Integer.sqrt
, trim
bukan String.trim
, import
akan membantu
iex()> import Integer
Integer
iex()> sqrt(100)
10.0
iex()> import String
String
iex()> trim(" Hello Elixir ")
"Hello Elixir"
Ini dapat menyebabkan masalah untuk membaca kode dan ketika ada pertentangan nama sehingga tidak direkomendasikan dalam Erlang (bahasa yang memengaruhi Elixir). Tetapi tidak ada konvensi semacam itu di Elixir, Anda dapat menggunakannya dengan risiko sendiri.
Dalam Python, efek yang sama dapat dilakukan oleh:
from math import *
dan itu hanya disarankan untuk digunakan dalam beberapa skenario khusus / mode interaktif - untuk pengetikan yang lebih pendek / lebih cepat.
gunakan & butuhkan
Apa yang membuat use
/ require
berbeda adalah bahwa mereka berhubungan dengan "makro" - konsep yang tidak ada dalam keluarga Python / Java / Golang ....
Anda tidak perlu import
modul untuk menggunakan fungsinya, tetapi Anda perlu require
modul untuk menggunakan makro :
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
Meskipun is_even
dapat ditulis sebagai fungsi normal, ini adalah makro karena:
Dalam Elixir, Integer.is_odd / 1 didefinisikan sebagai makro sehingga dapat digunakan sebagai pelindung.
https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use
, untuk kutipan dari Elixir doc:
Penggunaan membutuhkan modul yang diberikan dan kemudian memanggil __using__/1
callback di atasnya memungkinkan modul untuk menyuntikkan beberapa kode ke dalam konteks saat ini.
defmodule Example do
use Feature, option: :value
end
dikompilasi menjadi
defmodule Example do
require Feature
Feature.__using__(option: :value)
end
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Jadi menulis use X
sama dengan menulis
require X
X.__using__()
use/2
adalah makro , makro akan mengubah kode menjadi kode lain untuk Anda.
Anda akan ingin use MODULE
ketika Anda:
- ingin mengakses makronya (
require
)
- DAN jalankan
MODULE.__using__()
Diuji pada Elixir 1.5
import Module
membawa fungsi untuk digunakan di dalam modul Anda.use Module
membawa fungsi yang akan digunakan DAN memaparkannya di depan umum pada modul Anda