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