Ini adalah poin-poin penting dari Pemrograman dalam Scala, Edisi Kedua oleh Martin Odersky, Lex Spoon, Bill Venners. Saya ingin mencatat beberapa poin penting. Mereka mungkin tampak rusak dan tidak masuk akal jika Anda belum membaca bukunya. Ini untuk referensi pribadi. Jangan ragu untuk mengoreksi saya jika saya telah menafsirkan sesuatu yang salah dalam posting ini.

Bab 8— Fungsi dan Penutup

Scala menawarkan beberapa cara untuk mendefinisikan fungsi seperti fungsi yang merupakan anggota dari beberapa objek, fungsi yang bersarang di dalam fungsi, literal fungsi, dan nilai fungsi.

8.1 Metode

  • Cara yang paling umum — anggota suatu objek disebut metode:Def yang didefinisikan sebagai anggota kelas, sifat, atau objek tunggal disebut metode.

8.2 Fungsi lokal

  • Prinsip desain penting dari gaya pemrograman fungsional: program harus didekomposisi menjadi banyak fungsi kecil yang masing-masing melakukan tugas yang terdefinisi dengan baik. Memberikan fleksibilitas untuk membangun sistem yang kompleks dengan blok bangunan kecil.
  • Masalah: fungsi pembantu dapat mencemari namespace program.Solusi:Scala menawarkan pendekatan untuk mendefinisikan fungsi di dalam fungsi lain .
  • Ini disebut fungsi lokal: Sebuah def yang didefinisikan di dalam sebuah blok. Ini hanya terlihat di dalam blok penutup.
  • Fungsi lokal dapat mengakses parameter fungsi penutup.

8.3 Fungsi kelas satu

  • Scala memiliki fungsi kelas satu:Scala mendukung fungsi kelas satu, yang berarti Anda dapat mengekspresikan fungsi dalam sintaks literal fungsi, yaitu (x: Int) =› x+1, dan itu fungsi dapat diwakili oleh objek, yang merupakan nilai fungsi.
  • Literal fungsi dikompilasi ke dalam kelas yang ketika dipakai pada waktu proses adalah nilai fungsi . Jadi perbedaan antara literal fungsi dan nilai adalah bahwa literal ada dalam kode sumber, sedangkan nilai ada sebagai objek pada waktu proses.

  • Nilai fungsi dapat disimpan dalam variabel dan dapat dipanggil menggunakan fungsi biasa ()

8.4 Bentuk pendek dari fungsi literal

  • Jadikan fungsi literal lebih singkat: Hilangkan tipe parameter. Ini disebut pengetikan target.

  • Kedua, hilangkan tanda kurung di sekitar tipe parameter yang tipenya disimpulkan.

8.5 Sintaks placeholder

  • Gunakan garis bawah sebagai pengganti untuk satu atau beberapa parameter, jika parameter tersebut hanya muncul satu kali dalam literal fungsi.
  • Terkadang kompiler tidak dapat menyimpulkan tipenya dan lebih baik menentukan tipenya.
  • Beberapa garis bawah berarti beberapa parameter dan tidak menggunakan kembali satu parameter berulang kali.

8.6 Fungsi yang diterapkan sebagian

  • Seluruh daftar parameter dapat diganti dengan garis bawah.

  • Val a mengacu pada objek nilai fungsi yang dihasilkan secara otomatis oleh kompiler Scala dari sum _, ekspresi fungsi yang diterapkan sebagian. Kelas yang dihasilkan memiliki metode apply yang membutuhkan 3 argumen.
  • Seperangkat argumen parsial juga dapat diteruskan ke fungsi parsial seperti contoh di bawah ini:

  • Ekspresi fungsi yang diterapkan sebagian yang semua parameternya dihilangkan, dapat dinyatakan dengan lebih ringkas tanpa _ . someNumbers.foreach(println)Ini hanya diperbolehkan di tempat di mana suatu fungsi diperlukan.

8.7 Penutupan

  • Penutupan:Objek fungsi yang menangkap variabel bebas, dan dikatakan “tertutup” atas variabel yang terlihat pada saat variabel tersebut dibuat.
  • Sebuah fungsi literal tanpa variabel bebas, seperti (x: Int) =› x + 1, disebut suku tertutup. Namun setiap fungsi literal dengan variabel bebas, seperti (x: Int) =› x + more, merupakan suku terbuka.
  • Penutupan Scala menangkap variabel itu sendiri, bukan variabel yang dirujuk.

8.8 Formulir panggilan fungsi khusus

  • Scala mendukung parameter berulang, argumen bernama, dan argumen default
  • Parameter berulang —menunjukkan parameter terakhir pada suatu fungsi yang dapat diulang dengan menempatkan * setelah jenis param.
  • Di dalam fungsi, tipe param yang diulang adalah Array dari tipe yang dideklarasikan. Namun, meneruskan array akan menimbulkan kesalahan tipe. Untuk mencapainya, tambahkan argumen array dengan titik dua dan simbol _*. Notasi memberitahu kompiler untuk meneruskan setiap elemen sebagai argumennya sendiri.

  • Argumen bernama- memungkinkan Anda meneruskan argumen ke suatu fungsi dalam urutan berbeda. sintaks: fungsi(paramName1 = nilai, paramName2 = nilai)
  • Nilai param default-argumen untuk param tersebut dapat dihilangkan dari pemanggilan fungsi dan nilai default yang sesuai akan digunakan.

8.9 Rekursi ekor

  • Fungsi rekursif ekor-yang menyebut dirinya di satu-satunya tempat sebagai tindakan terakhirnya.
  • Melacak fungsi rekursif ekor: Semua panggilan akan dijalankan dalam satu frame. Pengoptimalan tail-call saat melihat pelacakan tumpukan dapat dimatikan dengan meneruskan argumen berikut: -g:notailcalls
  • Batas rekursi ekor:Scala hanya dapat mengoptimalkan panggilan balik rekursif langsung ke fungsi yang sama yang melakukan panggilan tersebut.
  • Rekursi tidak langsung tidak memiliki optimasi apa pun.

  • Tidak ada pengoptimalan panggilan ekor jika panggilan terakhir mengarah ke nilai fungsi.

Kesimpulan

Selain metode, Scala menyediakan fungsi lokal, literal fungsi, dan nilai fungsi. Selain pemanggilan fungsi normal, Scala menyediakan fungsi yang diterapkan sebagian dan fungsi dengan parameter berulang. Panggilan fungsi diimplementasikan sebagai panggilan ekor yang dioptimalkan jika memungkinkan.

Sebelumnya:



Berikutnya: