Elixir - Protokol
Protokol adalah mekanisme untuk mencapai polimorfisme di Elixir. Pengiriman pada protokol tersedia untuk semua tipe data selama itu mengimplementasikan protokol.
Mari kita perhatikan contoh penggunaan protokol. Kami menggunakan fungsi yang disebutto_stringdi bab-bab sebelumnya untuk mengkonversi dari tipe lain ke tipe string. Ini sebenarnya adalah protokol. Ini bertindak sesuai dengan masukan yang diberikan tanpa menghasilkan kesalahan. Ini mungkin tampak seperti kita sedang mendiskusikan fungsi pencocokan pola, tetapi ketika kita melangkah lebih jauh, ternyata berbeda.
Perhatikan contoh berikut untuk lebih memahami mekanisme protokol.
Mari kita buat protokol yang akan ditampilkan jika input yang diberikan kosong atau tidak. Kami akan menyebut protokol iniblank?.
Mendefinisikan Protokol
Kita dapat mendefinisikan protokol di Elixir dengan cara berikut -
defprotocol Blank do
def blank?(data)
end
Seperti yang Anda lihat, kita tidak perlu mendefinisikan body untuk fungsi tersebut. Jika Anda terbiasa dengan antarmuka dalam bahasa pemrograman lain, Anda dapat menganggap Protokol pada dasarnya sama.
Jadi Protokol ini mengatakan bahwa apapun yang mengimplementasikannya harus memiliki ekstensi empty?fungsi, meskipun terserah pelaksana tentang bagaimana fungsi merespons. Dengan protokol yang ditentukan, mari kita pahami cara menambahkan beberapa implementasi.
Menerapkan Protokol
Karena kita telah mendefinisikan protokol, sekarang kita perlu memberi tahu cara menangani input berbeda yang mungkin didapatnya. Mari kita bangun dari contoh yang telah kita ambil sebelumnya. Kami akan menerapkan protokol kosong untuk daftar, peta, dan string. Ini akan menunjukkan apakah benda yang kita lewati kosong atau tidak.
#Defining the protocol
defprotocol Blank do
def blank?(data)
end
#Implementing the protocol for lists
defimpl Blank, for: List do
def blank?([]), do: true
def blank?(_), do: false
end
#Implementing the protocol for strings
defimpl Blank, for: BitString do
def blank?(""), do: true
def blank?(_), do: false
end
#Implementing the protocol for maps
defimpl Blank, for: Map do
def blank?(map), do: map_size(map) == 0
end
IO.puts(Blank.blank? [])
IO.puts(Blank.blank? [:true, "Hello"])
IO.puts(Blank.blank? "")
IO.puts(Blank.blank? "Hi")
Anda dapat mengimplementasikan Protokol Anda untuk sebanyak atau sesedikit mungkin jenis yang Anda inginkan, apa pun yang masuk akal untuk penggunaan Protokol Anda. Ini adalah kasus penggunaan protokol yang cukup mendasar. Ketika program di atas dijalankan, menghasilkan hasil sebagai berikut -
true
false
true
false
Note - Jika Anda menggunakan ini untuk jenis apa pun selain yang Anda tentukan protokolnya, ini akan menghasilkan kesalahan.