Table of contents
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.
Did you find this article valuable?
Support Teten Nugraha by becoming a sponsor. Any amount is appreciated!