Pipe Operatörü

Merhaba.

Elixir'de modülleri birbirleri içinde kullanabiliyoruz. Yani modülleri birleştirebiliyoruz. Şimdilik iki iş yapan Drop ve Convert adında iki modülümüz var.

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

defmodule Convert do
  def mps_to_mph(mps) do
    2.23693629 * mps
  end

  def mps_to_kph(mps) do
    3.6 * mps
  end
end

Bu iki modülü compile edip ayrı ayrı kullanabiliriz.

iex(1)> c("drop.ex")
[Drop]
iex(2)> c("convert.ex")
[Convert]
iex(3)> Drop.fall_velocity(20)
19.79898987322333
iex(4)> Convert.mps_to_mph(Drop.fall_velocity(20))
44.289078952755766
iex(5)>

Fakat bu durum biraz garip. Çünkü bir modülün fonksiyonun sonucunu diğer modülün fonksiyonunda kullanmak istiyoruz. Bu durumda modülleri bir araya getirmek daha iyi olacaktır. Combined adında üçüncü bir modül oluşturalım.

defmodule Combined do
  def height_to_mph(meters) do
    Convert.mps_to_mph(Drop.fall_velocity(meters))
  end
end
iex(1)> c("combined.ex")
[Combined]
iex(2)> Combined.height_to_mph(20)
44.289078952755766
iex(3)>

Görüldüğü gibi üçüncü modülü compile ettikten sonra ayrı bir fonksiyon tanımlayıp, kullanabiliyoruz.

Elixir'de modülleri birleştirmenin daha güzel ve doğru bir yolu daha var. |> pipe operatörünü kullanarak modülleri birbirleri içinde çağırabiliyoruz. Birinci parametreyi, ikinci parametrede olan fonksiyonda kullanabilmek üzere atayabiliyoruz.

defmodule Combined do
  def height_to_mph(meters) do
    Drop.fall_velocity(meters) |> Convert.mps_to_mph
  end
end

Görüldüğü üzere pipe operatörünü kullanmak bize daha kolaylık sağlıyor ve okurken X goes into Y şeklinde okuyunca daha da açıklayıcı olabiliyor.

Sevgiler.