Call by Name and Call by Value, Klarifikasi Diperlukan
Pertanyaan
Seperti yang saya pahami, di Scala,fungsi dapat dipanggil dengan 2 cara:
- by-value, atau
- by-name
Misalnya, diberi deklarasi berikut, apakah kita tahu bagaimana fungsi akan dipanggil?
1
|
|
Panggil
1 2 3 |
|
Apa ketentuannya?
Jawaban
Contoh yang telah anda berikan hanya menggunakan call-by-value, jadi saya akan memberikan yang baru, sederhana, contoh yang menunjukkan perbedaan.
Pertama, mari kita asumsikan kita memiliki fungsi dengan side-effect
. Fungsi ini mencetak sesuatu dan kemudian mengembalikan sebuah Int
.
1 2 3 4 |
|
Sekarang kita akan mendefinisikan dua fungsi yang menerima argumen Int
yang persis sama kecuali yang satu membutuhkan argumen dalam gaya call-by-value (x: Int)
dan yang lainnya dalam gaya call-by-name (x: => Int)
1 2 3 4 |
|
1 2 3 4 |
|
Sekarang apa yang terjadi ketika kita memanggilnya dengan fungsi side-effect
kita?
1 2 3 4 5 6 7 8 9 10 |
|
Sehingga anda dapat melihat bahwa dalam versi call-by-value, side-effect
dari pemanggilan fungsi something()
hanya terjadi sekali. Namun, dalam versi call-by-name, side-effect
terjadi dua kali.
Hal ini karena fungsi call-by-value menghitung nilai ekspresi yang diberikan sebelum memanggil fungsi, sehingga nilai yang sama setiap kali diakses. Namun, fungsi call-by-name menghitung ulang nilai ekspresi yang diberikan setiap kali ia diakses.
Berikut ini adalah contoh dari Martin Odersky (penemu scala)
1
|
|
Kita ingin tahu evaluasi mana yang lebih cepat (langkah sedikit) dalam kondisi ini:
test (2, 3)
1 2 3 |
|
1 2 3 |
|
jadi 2 evaluasi disini sama
test(3+4, 8)
1 2 3 4 |
|
1 2 3 4 5 |
|
disini call-by-value lebih cepat
test(7, 2*4)
1 2 3 4 |
|
1 2 3 |
|
disini, call-by-name lebih cepat
test(3+4, 2*4)
1 2 3 4 5 |
|
1 2 3 4 5 |
|
lagi, keduanya sama.
Dalam kasus conton mu semua parameter akan dievaluasi sebelum fungsi tersebut dipanggil, karena kamu hanya mendefiniskan mereka by-value
. Jika kamu ingin mendefinisikan parameter kamu by-name
, kamu harus melewatkan kode block:
1
|
|
Dengan cara ini parameter x
akan dievaluasi sampai dipanggil dalam fungsi.