Scala - Call By Value And Call By Name

Posted by dogukanhan on March 02, 2019 · 1 min read

Scala içerisinde yazdığımız fonksiyonların parametreleri alış biçimine göre farklı yapılarda olabileceğini belirtmemiz gerekir. Bu iki yapı call by name ve call by value olarak adlandırılmıştır. Daha iyi fonksiyon yazabilmek ve işimize yaradığı şekilde kullanabilmek için bunun öğrenilmesi önemlidir.

Fonksiyonun callByValue yerine callByName olarak tanımlanması için değişen syntax farkı sadece değişken tipi ve iki nokta arasına => eklenmesi yeterlidir.

def callByValue(x:Long):Unit = {
    println("by value="+x)
    println("by value="+x)
  }
  def callByName(x: =>Long):Unit = {
    println("by name="+x)
    println("by name="+x)
  }
  callByValue(System.nanoTime)
  callByName(System.nanoTime)

Yukarıda iki farklı fonksiyon yapısının scala koduna yer verilmiştir, her iki fonksiyonda kendi içerisinde gelen parametrenin değerini iki kez ekrana yazmaktadır. Bunun amacı değerin değişip değişmeyeceğini kontrol etmektir. Fonksiyonları çağırmak için kullanılan System.nanoTime bize zaman bilgisini vermektedir.

Sizde değerler zamana göre farklı olmasına karşın göreceğimiz değer aşağıdaki gibi call by value ile çağrılanda iki çıktının aynı diğerinde ise değiştiğini gözlemleyeceksiniz.

by value=16409871087744
by value=16409871087744
by name=16409996238112
by name=16409996283210

Bunun sebebi fonksiyona value olarak gönderdiğimizde fonksiyonun artık, System.nano hakkında bilgiye sahip olmamasıdır. Yani fonksiyona parametre olarak long değeri gitmiştir ve fonksiyonda yer alan X değeri artık o değerdir.

Fakat name olarak tanımlanmış fonksiyona gönderdiğimizde o X değerinin geçtiği yerlerde System.nano tarafından verilen değerin o zamanki haline eşittir. Yani x kullanıldığında, System.nano’dan güncel değer okunur.

Adresine bakılabilir : https://alvinalexander.com/source-code/scala/simple-scala-call-name-example