Apa perbedaan antara use
dan import
?
Penggunaan adalah mekanisme sederhana untuk menggunakan modul yang diberikan ke dalam konteks saat ini
https://hexdocs.pm/elixir/Kernel.SpecialForms.html#import/2
Mengimpor fungsi dan makro dari modul lain
Sepertinya satu perbedaannya adalah import
mari kita memilih fungsi / makro tertentu sambil use
memasukkan semuanya.
Apakah ada perbedaan lain? Kapan Anda akan menggunakan satu di atas yang lain?
import Module
membawa fungsi untuk digunakan di dalam modul Anda.use Module
membawa fungsi yang akan digunakan DAN memaparkannya di depan umum pada modul AndaJawaban:
import Module
membawa semua Fungsi dan MakroModule
un-namespaced ke dalam modul Anda.require Module
memungkinkan Anda untuk menggunakan makroModule
tetapi tidak mengimpornya. (FungsiModule
selalu tersedia namespace.)use Module
requires
modul pertama dan kemudian memanggil__using__
makro aktifModule
.Pertimbangkan yang berikut ini:
Ini tidak akan dikompilasi karena
ModA.moda()
belum diimpor keModB
.Berikut ini akan dikompilasi:
Seperti ketika Anda
use
dModA
itu dihasilkanimport
pernyataan yang dimasukkan ke dalamModB
.sumber
*.ex
file dandefmodule
blok, dan bagaimana Anda akan menarik modul dari file ke iex REPL__using__
metode ini dijalankanuse ModA
? Mungkin masuk akal untuk hanya menggunakan impor dalamModB
contoh yang Anda berikan benar?use
dimaksudkan untuk menyuntikkan kode ke modul saat ini, sementaraimport
digunakan untuk, yah, mengimpor fungsi untuk digunakan. Anda dapat membangunuse
implementasi yang secara otomatis mengimpor fungsi misalnya, seperti yang saya lakukan dengan Timex ketika Anda menambahkanuse Timex
ke modul, lihat timex.ex jika Anda ingin tahu apa yang saya maksud , itu adalah contoh yang sangat sederhana tentang bagaimana membangun sebuah modul yang dapat berupause
'dsumber
use
lebih umum daripadaimport
? Artinya, fungsi dariimport
adalah bagian dariuse
import
masih perlu, karena saya tidak tahu apakah itu akurat untuk mengatakan Anda dapat menerapkan kembaliimport
denganuse
sendirian, tetapi saya tidak akan terkejut jika itu mungkin.use
benar-benar lebih kuat. Anda dapat melakukan hal-hal yang sangat rumit dengannya, misalnya, saya menggunakan banyakuse
dalamexprotobuf
proyek saya yang dapat Anda periksa jika Anda ingin melihatnya didorong ke batas itu. Anda dapat memperluas modul dengan kode, mengeksekusi kode pada waktu kompilasi, menambahkan fungsi ke modul, dll. Pada dasarnya menggabungkanimport
dan kekuatan makro.use
). Hampir pasti lebih mudah untuk membaca untuk pemula daripadaexprotobuf
, tapi saya pikir saya mungkin mendoronguse
ke batasexprotobuf
sehingga mungkin berguna hanya untuk melihat seberapa jauh Anda bisa mengambilnya.use
sebenarnya tidak berbuat banyak, itu hanya memanggil__using__
modul yang ditentukan.Lihat halaman «alias, perlu, dan impor» dari panduan memulai resmi elixir:
Memerlukan
Elixir menyediakan makro sebagai mekanisme untuk meta-pemrograman (menulis kode yang menghasilkan kode).
Makro adalah potongan kode yang dieksekusi dan diperluas pada waktu kompilasi. Ini berarti, untuk menggunakan makro, kita perlu menjamin modulnya dan implementasinya tersedia selama kompilasi. Ini dilakukan dengan
require
arahan.Secara umum, sebuah modul tidak perlu diminta sebelum digunakan, kecuali jika kita ingin menggunakan makro yang tersedia dalam modul itu.
Impor
Kami menggunakan
import
kapan pun kami ingin dengan mudah mengakses fungsi atau makro dari modul lain tanpa menggunakan nama yang sepenuhnya memenuhi syarat. Sebagai contoh, jika kita ingin menggunakanduplicate/2
fungsi dariList
modul beberapa kali, kita dapat mengimpornya:Dalam hal ini, kami hanya mengimpor fungsi
duplicate
(dengan arity 2) dariList
.Perhatikan bahwa
import
modul secara otomatisrequire
.Menggunakan
Meskipun bukan arahan,
use
adalah makro terkait eratrequire
yang memungkinkan Anda untuk menggunakan modul dalam konteks saat ini. Theuse
makro sering digunakan oleh pengembang untuk membawa fungsi eksternal ke dalam lingkup leksikal saat ini, sering modul.Di belakang layar,
use
memerlukan modul yang diberikan dan kemudian memanggil__using__/1
callback di atasnya memungkinkan modul untuk menyuntikkan beberapa kode ke dalam konteks saat ini. Secara umum, modul berikut:dikompilasi menjadi
sumber
Dengan latar belakang dari bahasa Python / Java / Golang,
import
vsuse
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:
Dalam Python / Java / Golang, Anda perlu
import MODULE
sebelum Anda dapat menggunakan fungsi dalam MODULE itu, misalnya PythonLalu apa yang
import
dilakukan Elixir mungkin mengejutkan Anda:https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Jadi jika Anda ingin mengetik
sqrt
bukanInteger.sqrt
,trim
bukanString.trim
,import
akan membantuIni 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:
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 perlurequire
modul untuk menggunakan makro :Meskipun
is_even
dapat ditulis sebagai fungsi normal, ini adalah makro karena:https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use
, untuk kutipan dari Elixir doc:dikompilasi menjadi
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Jadi menulis
use X
sama dengan menulisuse/2
adalah makro , makro akan mengubah kode menjadi kode lain untuk Anda.Anda akan ingin
use MODULE
ketika Anda:require
)MODULE.__using__()
Diuji pada Elixir 1.5
sumber
use Module
membutuhkanModule
dan juga memanggilnya__using__
.import Module
membawaModule
fungsionalitas ke dalam konteks saat ini , bukan hanya membutuhkannya.sumber
Impor
Membuat semua fungsi dan makro dari modul yang diberikan dapat diakses di dalam lingkup leksikal tempat namanya. Perlu diingat bahwa dalam kebanyakan kasus Anda hanya perlu satu fungsi / makro yang akan diimpor.
Contoh:
Menggunakan
Makro ini memungkinkan Anda untuk menyuntikkan kode apa pun dalam modul saat ini. Anda harus berhati-hati ketika menggunakan perpustakaan eksternal dengan
use
, karena Anda mungkin tidak yakin apa yang sebenarnya terjadi di balik layar.Contoh:
Di belakang kode adegan di dalam
__using__
telah disuntikkan ke dalamTextPrinter
modul.Omong-omong, ada lebih banyak instruksi penanganan ketergantungan dalam Elixir .
sumber