Diberikan tiga cara untuk mengekspresikan fungsi yang sama f(a) := a + 1
:
val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1
Apa perbedaan definisi ini? REPL tidak menunjukkan perbedaan yang jelas:
scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
f1
di REPL menunjukkan nilai yang terikat secara statisf1
saat mengevaluasif2
danf3
menampilkan hasil pemanggilan metode tersebut. Secara khusus,Function1[Int, Int]
instance baru diproduksi setiap kali salah satuf2
atauf3
dipanggil, sementaraf1
itu samaFunction1[Int, Int]
selamanya.Jawaban:
f1
adalah fungsi yang menggunakan integer dan mengembalikan integer.f2
adalah metode dengan nol arity yang mengembalikan fungsi yang mengambil integer dan mengembalikan integer. (Saat Anda mengetikf2
di REPL nanti, itu menjadi panggilan ke metodef2
.)f3
sama sepertif2
. Anda hanya tidak menggunakan inferensi tipe di sana.sumber
f1
afunction
danf2
apakah amethod
?apply
. Metode, yah, adalah metode.f2
sendiri tidak menerima argumen. Objek fungsi yang dikembalikan tidak.Di dalam kelas,
val
dievaluasi pada inisialisasi sementaradef
dievaluasi hanya ketika, dan setiap kali , fungsi dipanggil. Pada kode di bawah ini Anda akan melihat bahwa x dievaluasi saat pertama kali objek digunakan, tetapi tidak lagi saat anggota x diakses. Sebaliknya, y tidak dievaluasi saat objek dibuat, tetapi dievaluasi setiap kali anggota diakses.sumber
a
tidak dapat diubah dan dievaluasi saat inisialisasi, tetapib
tetap merupakan nilai yang dapat berubah. Jadi referensi keb
disetel selama inisialisasi, tetapi nilai yang disimpan olehb
tetap bisa berubah. Untuk bersenang-senang, sekarang Anda dapat membuat file baruval b = 123
. Setelah ini Andaa(5)
akan selalu memberi 11, karenab
sekarang adalah nilai yang sama sekali baru.Menjalankan definisi seperti def x = e tidak akan mengevaluasi ekspresi e . Sebaliknya e dievaluasi setiap kali x digunakan. Alternatifnya, Scala menawarkan definisi nilai val x = e , yang mengevaluasi sisi kanan e sebagai bagian dari evaluasi definisi. Jika x kemudian digunakan kemudian, itu segera diganti dengan nilai e yang telah dihitung sebelumnya , sehingga ekspresi tersebut tidak perlu dievaluasi lagi.
sumber