Penjelasan Kemalasan
Kira nilai hanya apabila diperlukan.
Penjelasan Kemalasan ialah pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 4 pelajaran.
Apakah Kemalasan?
Dalam Scala, kebanyakan nilai adalah tegas: nilai tersebut dikira sebaik sahaja anda mentakrifkannya. Kemalasan membalikkan keadaan ini. Nilai malas hanya dikira apabila diperlukan buat kali pertama, dan tidak pernah lebih awal.
Hal ini penting apabila pengiraan mahal, mungkin gagal, atau mungkin langsung tidak digunakan. Mengapa membayar kerja yang tiada siapa minta?
val Tegas
val biasa menilai bahagian kanannya serta-merta, walaupun anda tidak pernah membacanya lagi.
Jalankan ini dan perhatikan bahawa "computing" dicetak sebelum "after". Kerja tersebut berlaku semasa definisi.
object Demo extends App {
val x = { println("computing"); 42 }
println("after")
println(x)
}val Malas
Awali val dengan lazy dan penilaian ditangguhkan sehingga akses pertama.
Di sini, "after" dicetak dahulu, kemudian "computing" hanya apabila x dibaca. Hasilnya juga dicache: badan dijalankan paling banyak sekali.
object Demo extends App {
lazy val x = { println("computing"); 42 }
println("after")
println(x)
println(x)
}Parameter Mengikut Nama
Parameter yang diisytiharkan sebagai => A dihantar mengikut nama: argumen tidak dinilai sehingga digunakan di dalam kaedah.
Inilah asas kemalasan. LazyList menggunakan parameter mengikut nama supaya ekor tidak dikira sehingga diminta.
def maybe(cond: Boolean, value: => Int): Int =
if (cond) value else 0
val r = maybe(false, { println("side"); 99 })
// "side" never prints; value was unusedKenali LazyList
LazyList ialah jujukan malas Scala (ia menggantikan Stream yang lebih lama dalam versi 2.13 dan seterusnya). Kepalanya dinilai dengan segera, tetapi ekornya malas.
Elemen dihasilkan apabila diminta dan diingati selepas dikira, jadi sel yang sama tidak pernah dikira semula.
val ll = LazyList(1, 2, 3)
println(ll)
// prints LazyList(<not computed>) until forcedMemaksa Penilaian
LazyList kekal tidak dinilai sehingga anda memaksanya. Memanggil toList, foreach, atau mencetak setiap elemen akan memaksa sel-sel tersebut.
REPL menunjukkan <not computed> untuk ekor malas. Pemaksaan mendedahkan nilai sebenar.
object Demo extends App {
val ll = LazyList(1, 2, 3)
println(ll.toList)
}Operator #::
Anda menambah elemen di hadapan LazyList menggunakan #::. Berbeza daripada :: senarai, operan kanan #:: dihantar mengikut nama, jadi ekor tidak dibina sehingga diperlukan.
Ini membolehkan anda menerangkan jujukan yang bahagian selebihnya dikira secara malas.
val ll = 1 #:: 2 #:: 3 #:: LazyList.empty
println(ll.head)Memoisasi
Setelah sel LazyList dikira, nilainya disimpan. Membacanya semula tidak memerlukan kos dan ungkapan yang menghasilkannya tidak dijalankan dua kali.
Jalankan ini: "calc" dicetak hanya pada akses pertama bagi setiap elemen yang dipaksa, bukan pada bacaan berulang.
object Demo extends App {
val ll = LazyList(1, 2).map { n =>
println("calc " + n); n * 10
}
println(ll.head)
println(ll.head)
}Ekor Malas dalam Tindakan
Oleh sebab ekornya malas, anda boleh menggunakan map pada LazyList dan hanya elemen yang disentuh akan dikira.
Di sini "map" dicetak sekali sahaja walaupun senarai mempunyai tiga elemen, kerana hanya kepala yang dipaksa.
object Demo extends App {
val r = LazyList(1, 2, 3).map { n =>
println("map " + n); n + 1
}
println(r.head)
}Mengapa Kemalasan Membantu
Kemalasan membolehkan tiga perkara: mengelakkan kerja yang tidak digunakan, membina jujukan tidak terhingga, dan memisahkan cara anda menerangkan pengiraan daripada jumlah pengiraan yang dijalankan.
Anda menulis keseluruhan aliran pemprosesan sekali; pengguna menentukan berapa banyak elemen yang hendak diambil.
Satu Peringatan
Kemalasan mempunyai kos. LazyList melakukan memoisasi, jadi menyimpan rujukan kepada kepalanya mengekalkan setiap elemen yang dipaksa dalam memori. Untuk data yang sangat besar atau tidak terhingga, elakkan menyimpan kepala tersebut.
Selain itu, kesan sampingan dalam kod malas berlaku pada masa yang tidak dijangka, yang boleh menyukarkan penyahpepijatan.
Semakan Pantas
Uji pemahaman anda tentang penilaian malas.
Imbas Kembali
Penilaian tegas menjalankan kerja serta-merta; penilaian malas menangguhkannya sehingga diperlukan. lazy val dan parameter mengikut nama (=> A) ialah asasnya.
LazyList dibina berasaskannya: kepala tegas, ekor malas yang dimemoisasi, dan pemaksaan melalui toList atau akses elemen. Seterusnya, kita membina LazyList secara manual.
Pelajari Scala dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 39
- Pelajaran
- 143
Soalan Lazim
Adakah pelajaran “Penjelasan Kemalasan” percuma?
Ya — teks penuh “Penjelasan Kemalasan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, tingkat taraf kepada CoddyKit PRO. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Penjelasan Kemalasan”?
Kira nilai hanya apabila diperlukan. Anda berlatih Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Penjelasan Kemalasan” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian ini?
Ya. Setiap pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Penjelasan Kemalasan
- Membina LazyList
- Strim Tidak Terhingga
- Mengambil dan Menapis secara Malas