Matematikawan memiliki cara kecil mereka sendiri yang lucu, jadi alih-alih mengatakan "maka kita memanggil fungsi yang f
melewatinya x
sebagai parameter" seperti yang akan dikatakan oleh programmer, mereka berbicara tentang "menerapkan fungsi f
ke argumennya x
".
Dalam matematika dan ilmu komputer, Terapkan adalah fungsi yang menerapkan fungsi pada argumen.
Wikipedia
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 mengambil Int
parameter dan mengembalikan sebuah Int
akan memiliki tipe OO Function1[Int,Int]
.
// define a function in scala
(x:Int) => x + 1
// assign an object representing the function to a variable
val f = (x:Int) => x + 1
Karena semuanya adalah objek di Scala f
sekarang dapat diperlakukan sebagai referensi ke Function1[Int,Int]
objek. Sebagai contoh, kita dapat memanggil toString
metode yang diwarisi Any
, yang tidak mungkin untuk fungsi murni, karena fungsi tidak memiliki metode:
f.toString
Atau kita bisa mendefinisikan Function1[Int,Int]
objek lain dengan memanggil compose
metode f
dan merantai dua fungsi yang berbeda secara bersamaan:
val f2 = f.compose((x:Int) => x - 1)
Sekarang jika kita ingin benar-benar menjalankan fungsi, atau sebagai ahli matematika mengatakan "terapkan fungsi ke argumennya" kita akan memanggil apply
metode pada Function1[Int,Int]
objek:
f2.apply(2)
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 sebagai f(args)
. Di situlah kompilator Scala melangkah masuk dan kapan pun kami memiliki referensi f
ke objek fungsi dan menulis f (args)
untuk menerapkan argumen pada fungsi yang diwakilkan, kompiler diam-diam mengembang f (args)
ke pemanggilan metode objek f.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:
// we will be able to use this object as a function, as well as an object
object Foo {
var y = 5
def apply (x: Int) = x + y
}
Foo (1) // using Foo object in function notation
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:
List(1,2,3) // same as List.apply(1,2,3) but less clutter, functional notation
// the way the factory method invocation would have looked
// in other languages with OO notation - needless clutter
List.instanceOf(1,2,3)
Jadi apply
metode hanyalah cara praktis untuk menutup celah antara fungsi dan objek di Scala.