Modüller

Merhaba.

Elixir programlarını daha derli toplu yazmak ve çeşitli encapsulate işlerimlerini yapabilmek için modüllere ihtiyaç duyuyoruz. Modüller içerisinde fonksiyonlar tanımlayıp kullanabiliyor ayrıca modül içinde de modül tanımlayabiliyoruz.

Modüller .ex dosyasının içinde tanımlanıyor ve aynı Ruby'de olduğu gibi isimleri snake case ile yazılıyor. Örnek verecek olursak my_lovely_module.ex

defmodule Drop do
  def fall_velocity(distance) do
    :math.sqrt(2 * 9.8 * distance)
  end

  def mps_to_mph(mps) do
    2.23693629 * mps
  end

  def mps_to_kph(mps) do
    3.6 * mps
  end
end

Yukarıda görüldüğü gibi modül tanımına defmodule ile başlayıp, modül ismimizi büyük harfle yazarak başlıyoruz. Bir önceki yazıda anlattığımız anonim fonksiyonlar gibi burada metotları bir değere atamak zorunda değiliz. def do ... end arasına metotumuzun yapacağı işi yazıyoruz. defp ile private metot tanımlayabiliriz.

Şimdi gelelim modülü yazdığımız Elixir kodunu compile etmeye ve sonrasında kullanmaya. Önce iex ile bir Elixir shell açıyoruz ve c fonksiyonun içine modülümüzün adını yazıyoruz.

iex(1)> c("drop.ex")
[Drop]
iex(2)>

Modülün olduğu klasörü içine bakacak olursak bir adet `Elixir.Drop.beam adında bir compile edilmiş bir dosya görürüz. Bu dosya oluştuğuna göre artık modül içinde tanımladığım metotları kullanabiliriz.

iex(2)> Drop.fall_velocity(20)
19.79898987322333
iex(3)> Drop.mps_to_mph(Drop.fall_velocity(20))
44.289078952755766
iex(4)>

Elixir shell'e çıkıp, girsek bile tekrar tekrar compile edilmiş kodu kullanabiliriz. Bunun yanında her değişiklik yaptığımızda kodu tekrar compile edip, çalıştırmalıyız. Ancak bütün bunları yapmak istemiyorsak Elixir'in scripting versiyonu olan .exs de aynı şekilde kullanabiliriz.

Modülleri bu şekilde öğrenmiş olduk. Modülleri birbilerini içinde çağırabilir ve kullanabiliriz. Bu konuyu bir sonraki yazıda daha detaylı işleyeceğiz.

Sevgiler.