İksir - İşlevler

Bir işlev, belirli bir görevi gerçekleştirmek için birlikte düzenlenen bir dizi ifadedir. Programlamadaki fonksiyonlar çoğunlukla Math'daki fonksiyon gibi çalışır. İşlevlere bir miktar girdi verirsiniz, sağlanan girdiye göre çıktı üretirler.

Elixir'de 2 tür işlev vardır -

Anonim işlev

Kullanılarak tanımlanan fonksiyonlar fn..end constructanonim işlevlerdir. Bu işlevler bazen lambdas olarak da adlandırılır. Değişken isimlerine atanarak kullanılırlar.

İsimli işlev

Kullanılarak tanımlanan fonksiyonlar def keywordadlandırılmış işlevlerdir. Bunlar Elixir'de sağlanan yerel işlevlerdir.

Anonim İşlevler

Adından da anlaşılacağı gibi, anonim bir işlevin adı yoktur. Bunlar sıklıkla diğer işlevlere aktarılır. Elixir'de anonim bir işlevi tanımlamak için,fn ve endanahtar kelimeler. Bunların içinde, herhangi bir sayıda parametre ve fonksiyon gövdesini,->. Örneğin,

sum = fn (a, b) -> a + b end
IO.puts(sum.(1, 5))

Yukarıdaki program çalıştırıldığında, çalıştırıldığında aşağıdaki sonucu üretir -

6

Bu işlevlerin adlandırılmış işlevler gibi çağrılmadığını unutmayın. Bir '.işlev adı ve bağımsız değişkenleri arasında.

Yakalama Operatörünü Kullanma

Bu işlevleri, yakalama operatörünü kullanarak da tanımlayabiliriz. Bu, işlevler oluşturmak için daha kolay bir yöntemdir. Şimdi yakalama operatörünü kullanarak yukarıdaki toplam işlevini tanımlayacağız,

sum = &(&1 + &2) 
IO.puts(sum.(1, 2))

Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu üretir -

3

Kısa versiyonda, parametrelerimiz adlandırılmaz, ancak bizim için & 1, & 2, & 3, vb.

Desen Eşleştirme İşlevleri

Örüntü eşleştirme yalnızca değişkenler ve veri yapılarıyla sınırlı değildir. İşlevlerimizi polimorfik yapmak için örüntü eşleştirmeyi kullanabiliriz. Örneğin, 1 veya 2 giriş (bir tuple içinde) alabilen ve bunları konsola yazdırabilen bir işlev ilan edeceğiz,

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"})

Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu verir -

Hey people found in a tuple!
Hello and World found!

Adlandırılmış İşlevler

Fonksiyonları isimlerle tanımlayabiliriz, böylece onlara daha sonra kolayca başvurabiliriz. Adlandırılmış işlevler, def anahtar sözcüğü kullanılarak bir modül içinde tanımlanır. Adlandırılmış işlevler her zaman bir modülde tanımlanır. Adlandırılmış işlevleri çağırmak için, modül adlarını kullanarak onlara başvurmamız gerekir.

Aşağıdaki, adlandırılmış işlevlerin sözdizimidir -

def function_name(argument_1, argument_2) do
   #code to be executed when function is called
end

Şimdi Math modülünde adlandırılmış fonksiyon toplamımızı tanımlayalım.

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

IO.puts(Math.sum(5, 6))

Yukarıdaki programı çalıştırırken, aşağıdaki sonucu verir -

11

1 satırlık işlevler için, bu işlevleri tanımlamak için bir kısaltma notasyonu vardır. do:. Örneğin -

defmodule Math do
   def sum(a, b), do: a + b
end
IO.puts(Math.sum(5, 6))

Yukarıdaki programı çalıştırırken, aşağıdaki sonucu verir -

11

Özel İşlevler

Elixir, bize, tanımlandıkları modülden erişilebilen özel fonksiyonları tanımlama yeteneği sağlar. Özel bir işlevi tanımlamak için kullanındefp onun yerine def. Örneğin,

defmodule Greeter do
   def hello(name), do: phrase <> name
   defp phrase, do: "Hello "
end

Greeter.hello("world")

Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu verir -

Hello world

Ancak, ifade işlevini açıkça çağırmaya çalışırsak, Greeter.phrase() işlevi, bir hata oluşturacaktır.

Varsayılan argümanlar

Bir bağımsız değişken için varsayılan bir değer istiyorsak, argument \\ value sözdizimi -

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")

Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu verir -

Hello, Ayush
Hello, Ayush
Hola, Ayush