Elixir - Fungsi
Fungsi adalah sekumpulan pernyataan yang disusun bersama untuk melakukan tugas tertentu. Fungsi dalam pemrograman bekerja kebanyakan seperti fungsi dalam Matematika. Anda memberi fungsi beberapa masukan, mereka menghasilkan keluaran berdasarkan masukan yang diberikan.
Ada 2 jenis fungsi di Elixir -
Fungsi anonim
Fungsi ditentukan menggunakan fn..end constructadalah fungsi anonim. Fungsi ini terkadang juga disebut sebagai lambda. Mereka digunakan dengan menugaskannya ke nama variabel.
Fungsi bernama
Fungsi ditentukan menggunakan def keyworddiberi nama fungsi. Ini adalah fungsi asli yang disediakan di Elixir.
Fungsi Anonim
Seperti namanya, fungsi anonim tidak memiliki nama. Ini sering kali diteruskan ke fungsi lain. Untuk mendefinisikan fungsi anonim di Elixir, kita membutuhkanfn dan endkata kunci. Di dalamnya, kita dapat menentukan sejumlah parameter dan badan fungsi yang dipisahkan oleh->. Sebagai contoh,
sum = fn (a, b) -> a + b end
IO.puts(sum.(1, 5))
Saat menjalankan program di atas, dijalankan, ini menghasilkan hasil sebagai berikut -
6
Perhatikan bahwa fungsi-fungsi ini tidak dipanggil seperti fungsi yang dinamai. Kita punya sebuah '.'antara nama fungsi dan argumennya.
Menggunakan Capture Operator
Kami juga dapat mendefinisikan fungsi-fungsi ini menggunakan operator penangkapan. Ini adalah metode yang lebih mudah untuk membuat fungsi. Sekarang kita akan mendefinisikan fungsi penjumlahan di atas menggunakan operator penangkapan,
sum = &(&1 + &2)
IO.puts(sum.(1, 2))
Ketika program di atas dijalankan, ini menghasilkan hasil sebagai berikut -
3
Dalam versi singkat, parameter kita tidak dinamai tetapi tersedia untuk kita sebagai & 1, & 2, & 3, dan seterusnya.
Fungsi Pencocokan Pola
Pencocokan pola tidak hanya terbatas pada variabel dan struktur data. Kita bisa menggunakan pencocokan pola untuk membuat fungsi kita polimorfik. Misalnya, kami akan mendeklarasikan fungsi yang dapat mengambil 1 atau 2 input (dalam tupel) dan mencetaknya ke konsol,
handle_result = fn
{var1} -> IO.puts("#{var1} found in a tuple!")
{var_2, var_3} -> IO.puts("#{var_2} and #{var_3} found!")
end
handle_result.({"Hey people"})
handle_result.({"Hello", "World"})
Ketika program di atas dijalankan, menghasilkan hasil sebagai berikut -
Hey people found in a tuple!
Hello and World found!
Fungsi Bernama
Kita bisa mendefinisikan fungsi dengan nama sehingga kita bisa dengan mudah merujuknya nanti. Fungsi bernama didefinisikan dalam modul menggunakan kata kunci def. Fungsi bernama selalu ditentukan dalam modul. Untuk memanggil fungsi bernama, kita perlu mereferensikannya menggunakan nama modulnya.
Berikut ini adalah sintaks untuk fungsi bernama -
def function_name(argument_1, argument_2) do
#code to be executed when function is called
end
Sekarang mari kita tentukan jumlah fungsi yang dinamai dalam modul Matematika.
defmodule Math do
def sum(a, b) do
a + b
end
end
IO.puts(Math.sum(5, 6))
Saat menjalankan program di atas, ini menghasilkan hasil sebagai berikut -
11
Untuk fungsi 1-liner, terdapat notasi singkatan untuk mendefinisikan fungsi-fungsi ini, menggunakan do:. Misalnya -
defmodule Math do
def sum(a, b), do: a + b
end
IO.puts(Math.sum(5, 6))
Saat menjalankan program di atas, ini menghasilkan hasil sebagai berikut -
11
Fungsi Pribadi
Elixir memberi kita kemampuan untuk mendefinisikan fungsi privat yang dapat diakses dari dalam modul di mana mereka didefinisikan. Untuk menentukan fungsi privat, gunakandefp dari pada def. Sebagai contoh,
defmodule Greeter do
def hello(name), do: phrase <> name
defp phrase, do: "Hello "
end
Greeter.hello("world")
Ketika program di atas dijalankan, menghasilkan hasil sebagai berikut -
Hello world
Tetapi jika kita hanya mencoba memanggil fungsi frase secara eksplisit, menggunakan Greeter.phrase() fungsi, itu akan menimbulkan kesalahan.
Argumen default
Jika kita menginginkan nilai default untuk sebuah argumen, kita menggunakan argument \\ value sintaks -
defmodule Greeter do
def hello(name, country \\ "en") do
phrase(country) <> name
end
defp phrase("en"), do: "Hello, "
defp phrase("es"), do: "Hola, "
end
Greeter.hello("Ayush", "en")
Greeter.hello("Ayush")
Greeter.hello("Ayush", "es")
Ketika program di atas dijalankan, menghasilkan hasil sebagai berikut -
Hello, Ayush
Hello, Ayush
Hola, Ayush