Saya tidak pernah memahaminya dari contoh-contoh kata benda yang dibuat dan dibuat-buat (sebuah AddTwo
kelas memiliki apply
yang menambah dua!) Contoh.
Saya mengerti bahwa itu sintaksis gula, jadi (saya menyimpulkan dari konteks) itu pasti dirancang untuk membuat beberapa kode lebih intuitif.
Apa arti yang diberikan oleh kelas dengan suatu apply
fungsi? Apa yang digunakan untuk itu, dan untuk apa tujuannya membuat kode menjadi lebih baik (unmarshalling, verbing nouns, dll)?
bagaimana itu membantu ketika digunakan dalam objek pengiring?
Jawaban:
Matematikawan memiliki cara kecil mereka sendiri yang lucu, jadi alih-alih mengatakan "maka kita memanggil fungsi yang
f
melewatinyax
sebagai parameter" seperti yang akan dikatakan oleh programmer, mereka berbicara tentang "menerapkan fungsif
ke argumennyax
".apply
melayani tujuan menutup celah antara paradigma Berorientasi Objek dan Fungsional di Scala. Setiap fungsi dalam Scala dapat direpresentasikan sebagai objek. Setiap fungsi juga memiliki tipe OO: misalnya, sebuah fungsi yang mengambilInt
parameter dan mengembalikan sebuahInt
akan memiliki tipe OOFunction1[Int,Int]
.Karena semuanya adalah objek di Scala
f
sekarang dapat diperlakukan sebagai referensi keFunction1[Int,Int]
objek. Sebagai contoh, kita dapat memanggiltoString
metode yang diwarisiAny
, yang tidak mungkin untuk fungsi murni, karena fungsi tidak memiliki metode:Atau kita bisa mendefinisikan
Function1[Int,Int]
objek lain dengan memanggilcompose
metodef
dan merantai dua fungsi yang berbeda secara bersamaan:Sekarang jika kita ingin benar-benar menjalankan fungsi, atau sebagai ahli matematika mengatakan "terapkan fungsi ke argumennya" kita akan memanggil
apply
metode padaFunction1[Int,Int]
objek:Menulis
f.apply(args)
setiap kali Anda ingin menjalankan fungsi yang diwakili sebagai objek adalah cara yang berorientasi objek, tetapi akan menambahkan banyak kekacauan pada kode tanpa menambahkan banyak informasi tambahan dan alangkah baiknya untuk dapat menggunakan lebih banyak notasi standar, seperti sebagaif(args)
. Di situlah kompilator Scala melangkah masuk dan kapan pun kami memiliki referensif
ke objek fungsi dan menulisf (args)
untuk menerapkan argumen pada fungsi yang diwakilkan, kompiler diam-diam mengembangf (args)
ke pemanggilan metode objekf.apply (args)
.Setiap fungsi dalam Scala dapat diperlakukan sebagai objek dan berfungsi dengan cara lain juga - setiap objek dapat diperlakukan sebagai fungsi, asalkan memiliki
apply
metode. Objek tersebut dapat digunakan dalam notasi fungsi:Ada banyak kasus penggunaan ketika kita ingin memperlakukan objek sebagai fungsi. Skenario yang paling umum adalah pola pabrik . Alih-alih menambahkan kekacauan pada kode menggunakan metode pabrik, kita dapat
apply
menolak serangkaian argumen untuk membuat instance baru dari kelas terkait:Jadi
apply
metode hanyalah cara praktis untuk menutup celah antara fungsi dan objek di Scala.sumber
class Average[YType](yZeroValue:YType)
. Bagaimana Anda melewati YType dari objek itu karena objek tidak dapat mengambil params jenis?apply
danunapply
metode ke objek pendamping kelas (antara lain). Jadi mendefinisikan kelas dengan hanya satu baris seperti inicase class Car(make:String, model: String, year: Short, color: String)
memungkinkan untuk menghasilkan objek baru dari kelas Mobil dengan hanya:val myCar = Car("VW","Golf",1999,"Blue")
. Ini adalah singkatan untukCar.apply(...)
every object can be treated as a function, provided it has the apply method
- Sekarang sangat masuk akal.Itu berasal dari gagasan bahwa Anda sering ingin menerapkan sesuatu pada suatu objek. Contoh yang lebih akurat adalah pabrik. Saat Anda memiliki pabrik, Anda ingin menerapkan parameter padanya untuk membuat objek.
Orang-orang Scala berpikir bahwa, seperti yang terjadi dalam banyak situasi, mungkin lebih baik memiliki jalan pintas untuk menelepon
apply
. Jadi, ketika Anda memberikan parameter langsung ke objek, itu seolah-olah Anda melewati parameter ini ke fungsi yang berlaku dari objek itu:Ini sering digunakan dalam objek pendamping, untuk memberikan metode pabrik yang bagus untuk kelas atau sifat, berikut adalah contohnya:
Dari pustaka standar scala, Anda mungkin melihat bagaimana
scala.collection.Seq
diimplementasikan:Seq
adalah suatu sifat, sehingganew Seq(1, 2)
tidak akan mengkompilasi tetapi berkat objek pendamping dan berlaku, Anda dapat memanggilSeq(1, 2)
dan implementasinya dipilih oleh objek pendamping.sumber
Ini adalah contoh kecil bagi mereka yang ingin membaca dengan cepat
sumber