Dengan latar belakang dari bahasa Python / Java / Golang, importvs useitu 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 MODULEsebelum Anda dapat menggunakan fungsi dalam MODULE itu, misalnya Python
In []: import math
In []: math.sqrt(100)
Out[]: 10.0
Lalu apa yang importdilakukan 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 sqrtbukan Integer.sqrt, trimbukan String.trim, importakan 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/ requireberbeda adalah bahwa mereka berhubungan dengan "makro" - konsep yang tidak ada dalam keluarga Python / Java / Golang ....
Anda tidak perlu importmodul untuk menggunakan fungsinya, tetapi Anda perlu requiremodul 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_evendapat 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__/1callback 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 Xsama dengan menulis
require X
X.__using__()
use/2 adalah makro , makro akan mengubah kode menjadi kode lain untuk Anda.
Anda akan ingin use MODULEketika Anda:
- ingin mengakses makronya (
require)
- DAN jalankan
MODULE.__using__()
Diuji pada Elixir 1.5
import Modulemembawa fungsi untuk digunakan di dalam modul Anda.use Modulemembawa fungsi yang akan digunakan DAN memaparkannya di depan umum pada modul Anda