İksir - Protokoller
Protokoller, Elixir'de polimorfizme ulaşmak için bir mekanizmadır. Bir protokol üzerinde gönderme, protokolü uyguladığı sürece herhangi bir veri türü için kullanılabilir.
Protokol kullanımının bir örneğini ele alalım. Adlı bir işlev kullandıkto_stringönceki bölümlerde diğer türlerden dizgi türüne dönüştürmek için. Bu aslında bir protokoldür. Verilen girdiye göre hata üretmeden hareket eder. Bu, örüntü eşleştirme işlevlerini tartışıyormuşuz gibi görünebilir, ancak ilerledikçe durum farklı çıkıyor.
Protokol mekanizmasını daha iyi anlamak için aşağıdaki örneği düşünün.
Verilen girişin boş olup olmadığını gösterecek bir protokol oluşturalım. Bu protokolü arayacağızblank?.
Bir Protokol Tanımlamak
Elixir'de bir protokolü şu şekilde tanımlayabiliriz -
defprotocol Blank do
def blank?(data)
end
Gördüğünüz gibi, işlev için bir gövde tanımlamamıza gerek yok. Diğer programlama dillerindeki arayüzlere aşina iseniz, bir Protokolü esasen aynı şey olarak düşünebilirsiniz.
Dolayısıyla bu Protokol, onu uygulayan herhangi bir şeyin bir empty?işlev, ancak işlevin nasıl yanıt vereceği uygulayıcıya bağlıdır. Tanımlanan protokol ile birkaç uygulamanın nasıl ekleneceğini anlayalım.
Bir Protokolün Uygulanması
Bir protokol tanımladığımız için, şimdi ona alabileceği farklı girdileri nasıl kullanacağını söylememiz gerekiyor. Daha önce aldığımız örnek üzerine inşa edelim. Listeler, haritalar ve dizeler için boş protokolü uygulayacağız. Bu, geçtiğimiz şeyin boş olup olmadığını gösterecektir.
#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")
Protokolünüzü istediğiniz kadar çok veya az tür için uygulayabilirsiniz, Protokolünüzün kullanımı için mantıklı olan her ne ise. Bu, protokollerin oldukça basit bir kullanım durumuydu. Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu verir -
true
false
true
false
Note - Bunu, protokolü tanımladığınız türlerin dışında kullanırsanız, bir hata oluşturur.