Elixir - Alias
Untuk memfasilitasi penggunaan kembali perangkat lunak, Elixir menyediakan tiga arahan - alias, require dan import. Ini juga menyediakan makro yang disebut penggunaan yang diringkas di bawah ini -
# Alias the module so it can be called as Bar instead of Foo.Bar
alias Foo.Bar, as: Bar
# Ensure the module is compiled and available (usually for macros)
require Foo
# Import functions from Foo so they can be called without the `Foo.` prefix
import Foo
# Invokes the custom code defined in Foo as an extension point
use Foo
Sekarang mari kita pahami secara rinci tentang setiap arahan.
alias
Direktif alias memungkinkan Anda mengatur alias untuk nama modul apa pun. Misalnya jika Anda ingin memberi alias'Str' ke modul String, Anda cukup menulis -
alias String, as: Str
IO.puts(Str.length("Hello"))
Program di atas menghasilkan hasil sebagai berikut -
5
Alias diberikan ke String modul sebagai Str. Sekarang ketika kita memanggil fungsi apa pun menggunakan literal Str, sebenarnya itu merujuk keStringmodul. Ini sangat membantu ketika kita menggunakan nama modul yang sangat panjang dan ingin menggantinya dengan yang lebih pendek di lingkup saat ini.
NOTE - Alias MUST mulai dengan huruf kapital.
Alias hanya valid di dalam lexical scope mereka dipanggil. Misalnya, jika Anda memiliki 2 modul dalam sebuah file dan membuat alias di dalam salah satu modul, alias itu tidak akan dapat diakses di modul kedua.
Jika Anda memberi nama modul bawaan, seperti String atau Tuple, sebagai alias untuk beberapa modul lain, untuk mengakses modul bawaan, Anda harus menambahkannya dengan "Elixir.". Sebagai contoh,
alias List, as: String
#Now when we use String we are actually using List.
#To use the string module:
IO.puts(Elixir.String.length("Hello"))
Ketika program di atas dijalankan, ini menghasilkan hasil sebagai berikut -
5
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. Artinya, untuk menggunakan makro, kita perlu menjamin bahwa modul dan implementasinya tersedia selama kompilasi. Ini dilakukan denganrequire pengarahan.
Integer.is_odd(3)
Ketika program di atas dijalankan, maka akan menghasilkan hasil sebagai berikut -
** (CompileError) iex:1: you must require Integer before invoking the macro Integer.is_odd/1
Dalam Elixir, Integer.is_odd didefinisikan sebagai a macro. Makro ini bisa digunakan sebagai pelindung. Artinya, untuk memohonInteger.is_odd, kita membutuhkan modul Integer.
Menggunakan require Integer berfungsi dan menjalankan program seperti yang ditunjukkan di bawah ini.
require Integer
Integer.is_odd(3)
Kali ini program akan berjalan dan menghasilkan keluaran berupa: true.
Secara umum, modul tidak diperlukan sebelum digunakan, kecuali jika kita ingin menggunakan makro yang tersedia di modul tersebut. Upaya untuk memanggil makro yang tidak dimuat akan menimbulkan kesalahan. Perhatikan bahwa seperti perintah alias, require juga memiliki cakupan leksikal . Kami akan berbicara lebih banyak tentang makro di bab selanjutnya.
impor
Kami menggunakan importdirektif untuk mengakses fungsi atau makro dengan mudah dari modul lain tanpa menggunakan nama yang sepenuhnya memenuhi syarat. Misalnya, jika kita ingin menggunakan fileduplicate fungsi dari modul Daftar beberapa kali, kita cukup mengimpornya.
import List, only: [duplicate: 2]
Dalam hal ini, kami hanya mengimpor fungsi duplikat (dengan panjang daftar argumen 2) dari Daftar. Meskipun:only bersifat opsional, penggunaannya disarankan untuk menghindari impor semua fungsi dari modul tertentu di dalam namespace. :except bisa juga diberikan sebagai opsi untuk mengimpor semuanya dalam modul kecuali daftar fungsi.
Itu import direktif juga mendukung :macros dan :functions untuk diberikan kepada :only. Misalnya, untuk mengimpor semua makro, pengguna dapat menulis -
import Integer, only: :macros
Perhatikan bahwa impor juga Lexically scopedseperti yang dibutuhkan dan arahan alias. Perhatikan juga itu'import'ing a module also 'require's it.
menggunakan
Meski bukan arahan, use adalah makro yang terkait erat dengan requireyang memungkinkan Anda menggunakan modul dalam konteks saat ini. Makro penggunaan sering digunakan oleh pengembang untuk membawa fungsionalitas eksternal ke dalam lingkup leksikal saat ini, seringkali modul. Mari kita pahami penggunaan direktif melalui contoh -
defmodule Example do
use Feature, option: :value
end
Gunakan adalah makro yang mengubah hal di atas menjadi -
defmodule Example do
require Feature
Feature.__using__(option: :value)
end
Itu use Module pertama membutuhkan modul dan kemudian memanggil __using__makro pada Modul. Elixir memiliki kemampuan metaprogramming yang hebat dan memiliki makro untuk menghasilkan kode pada waktu kompilasi. Makro _ _using__ dipanggil pada contoh di atas, dan kode dimasukkan ke dalam konteks lokal kita. Konteks lokal adalah tempat penggunaan makro dipanggil pada saat kompilasi.