Teten Nugraha
Backendhabit

Backendhabit

Memahami Call by Value vs Call by Name di Scala

Memahami Call by Value vs Call by Name di Scala

Teten Nugraha's photo
Teten Nugraha
·Mar 29, 2022·

2 min read

Table of contents

  • Pengenalan
  • Call By Value
  • Call By Name

Pengenalan

Dalam video course "Functional Programming" oleh Martin Odersky pada pembahasan fundamental nya beliau menyebutkan istilah call by value vs call by name. Pada awalnya saya bingung karena secara sekilas tidak ada perbedaaan, namun ketika saya mencari sumber lain ternyata terdapat perbedaan yang cukup jelas. Call by Name and Call by value adalah salah satu evaluate expression yang membedakan bagaimana sebuah fungsi mengeksekusi sebuah parameter. Untuk lebih jelasnya kita simak contoh dibawah ini.

Call By Value

object callby extends App {

  def callByValue(i: Int, y: String): Unit = {
    println(i)
    println(y)
    println(y)
  }

  // test call by value
  callByValue(100, "Ini Adalah String")

}

Dalam contoh kode di atas saya membuat sebuah function yang menerima parameter dengan value integer dan string, kemudian dalam bodi function angka itu ditampilkan menggunakan println(), jika kalian execute function diatas, maka hasilnya akan seperti dibawah ini

100
Ini Adalah String
Ini Adalah String

Dari contoh diatas kita bisa langsung membaca bahwa kode berjalan seperti biasa pada umumnya, ketika println(i) di panggil maka akan mencetak angka 100 begitu juga ketika println(y) dipanggil dua kali maka output nya juga sama karena call by value ini jelas melempar nilai yang jelas, beda dengan call by name, mari kita lihat perbedaanya,

Call By Name

import java.util.UUID

object callby extends App {

  def callByName(x: Int, z: => String): Unit = {
    println(x)
    println(z)
    println(z)
  }

  // test call by Name
  callByName(10, UUID.randomUUID().toString)
}

jika code diatas kita jalankan maka hasilnya akan seperti berikut :

10
f59977e4-5fe7-4a41-ba7d-282c45bf6893
2ed4f96d-dc18-4d3b-a3a0-7a8ce886de2e

dalam function callByName parameter x jelas dia hanya menerima value yang dan kita mengirim angka 10, dan sampai disini scala hanya mencetak angka 10 saja. Namun untuk paramter kedua yaitu z kita menambahkan simbol => sebagai penanda bahwa yang kita kirimkan itu bukan value melainkan ekspresi yaitu ekspressi dari UUID.randomUUID().toString, jadi kasarnya scala akan membaca ekspressinya seperti ini :

 def callByName(x: Int, z: => String): Unit = {
    println(x)
    println(UUID.randomUUID().toString)
    println(UUID.randomUUID().toString)
  }

itulah kenapa ketika menampilkan value dari parameter z, nilai nya berubah-ubah, nah seperti itulah contoh dari Call By Name.

Mudah-mudahan artikel ini dapat membantu teman-teman yang sedang belajar Scala seperti saya.

 
Share this