İksir - Davranışlar
Elixir'deki (ve Erlang'daki) davranışlar, bir bileşenin genel bölümünü (davranış modülü haline gelen) belirli bir parçadan (geri arama modülü haline gelen) ayırmanın ve soyutlamanın bir yoludur. Davranışlar bir yol sağlar -
- Bir modül tarafından uygulanması gereken bir dizi işlevi tanımlayın.
- Bir modülün o setteki tüm fonksiyonları uyguladığından emin olun.
Gerekirse, Java gibi nesne yönelimli dillerdeki arabirimler gibi davranışlar düşünebilirsiniz: bir modülün uygulaması gereken bir dizi işlev imzası.
Bir Davranışı Tanımlamak
Kendi davranışımızı yaratmak için bir örnek düşünelim ve sonra bu genel davranışı bir modül oluşturmak için kullanalım. İnsanları farklı dillerde merhaba ve hoşçakal selamlayan bir davranış tanımlayacağız.
defmodule GreetBehaviour do
@callback say_hello(name :: string) :: nil
@callback say_bye(name :: string) :: nil
end
@callbackyönergesi, modülleri benimseyenlerin tanımlaması gereken işlevleri listelemek için kullanılır. Ayrıca no belirtir. değişkenler, türleri ve dönüş değerleri.
Bir Davranış benimsemek
Bir davranışı başarıyla tanımladık. Şimdi bunu birden çok modülde benimseyip uygulayacağız. Bu davranışı İngilizce ve İspanyolca olarak uygulayan iki modül oluşturalım.
defmodule GreetBehaviour do
@callback say_hello(name :: string) :: nil
@callback say_bye(name :: string) :: nil
end
defmodule EnglishGreet do
@behaviour GreetBehaviour
def say_hello(name), do: IO.puts("Hello " <> name)
def say_bye(name), do: IO.puts("Goodbye, " <> name)
end
defmodule SpanishGreet do
@behaviour GreetBehaviour
def say_hello(name), do: IO.puts("Hola " <> name)
def say_bye(name), do: IO.puts("Adios " <> name)
end
EnglishGreet.say_hello("Ayush")
EnglishGreet.say_bye("Ayush")
SpanishGreet.say_hello("Ayush")
SpanishGreet.say_bye("Ayush")
Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu verir -
Hello Ayush
Goodbye, Ayush
Hola Ayush
Adios Ayush
Daha önce görmüş olduğunuz gibi, @behaviourmodüldeki yönerge. Tüm alt modüller için davranışta uygulanan tüm işlevleri tanımlamalıyız . Bu, kabaca OOP dillerindeki arayüzlere eşdeğer olarak düşünülebilir.