Scala tidak memiliki break
atau continue
, sehingga beberapa perilaku berulang membutuhkan lebih banyak pemikiran.
Mengakhiri loop lebih awal membutuhkan rekursi ekor, pengecualian, atau scala.util.control.Breaks
(yang menggunakan pengecualian).
Alasan untuk ini adalah bahwa, seperti goto
, mereka adalah konstruksi aliran yang mengaburkan aliran, dan dapat dicapai dengan cara yang lebih baik, tidak terlalu mengejutkan.
Tapi sepertinya argumen yang sama bisa digunakan untuk itu return
.
Mengapa Scala sengaja menghilangkan break
dan continue
, tetapi tidak return
?
language-design
scala
control-structures
Paul Draper
sumber
sumber
break
dancontinue
membutuhkan beberapa mesin pembersihan tambahan. OTOHreturn
adalah cara untuk menghentikan fungsi secara tertib, dan semua mesin pembersihan sudah ada di sana.breakable { for { break; } }
renungan, dan kemungkinan jauh dari efisien.break
dancontinue
terkandung dalam pertanyaan Anda dan di tautan dalam pertanyaan Anda. Pertanyaannyareturn
adalah persis apa pertanyaan yang saya tautkan, dan dijawab, setidaknya dalam jawaban yang dipilih, yang diterima. Jika kedua jawaban tersebut tidak menjawab pertanyaan Anda, mungkin Anda dapat mengedit pertanyaan untuk menjelaskannya.Jawaban:
Istirahat dan Lanjutkan:
Dalam sebuah pembicaraan tentang Scala , Martin Odersky memberi 3 alasan untuk tidak memasukkan istirahat atau melanjutkan slide 22:
Dan dia kemudian berkata, "Kita dapat mendukung mereka sepenuhnya di perpustakaan." Pada slide 23, ia memberikan kode yang mengimplementasikan
break
. Meskipun saya tidak begitu tahu Scala cukup baik untuk memastikan, sepertinya potongan pendek pada slide itu adalah semua yang diperlukan untuk mengimplementasikanbreak
, dan itucontinue
dapat diimplementasikan dalam kode yang sama pendeknya.Mampu menerapkan hal-hal seperti ini di perpustakaan menyederhanakan bahasa inti.
Dalam 'Pemrograman dalam Scala, Edisi Kedua', oleh Martin Odersky, Lex Spoon, dan Bill Venners, penjelasan berikut diberikan:
Kembali:
Pengembalian dapat dianggap sebagai keharusan dalam gaya, karena pengembalian adalah kata kerja, perintah untuk melakukan sesuatu. Tetapi mereka juga dapat dilihat secara murni fungsional / deklaratif: mereka mendefinisikan apa nilai balik dari fungsi tersebut (bahkan jika, dalam suatu fungsi dengan banyak pengembalian, mereka masing-masing hanya memberikan definisi parsial).
Dalam buku yang sama, mereka mengatakan hal berikut tentang
return
:Metode mengakhiri dan mengembalikan nilai, bahkan jika a
return
pernyataan tidak digunakan, sehingga tidak ada masalah dengan penutupan, karena jika tidak, penutupan tidak akan bekerja.Juga tidak ada masalah menyatu dengan fungsi literal, karena fungsi tetap harus mengembalikan nilai.
sumber
Saya pikir jawaban sebelumnya adil untuk masalah mendefinisikan semantik untuk
break
ataucontinue
dalam bahasa untuk Scala, dengan konteks yang relatif tidak dibatasi.Saya menulis perpustakaan kecil yang mendefinisikan
break
dancontinue
dalam konteks yang lebih terbatas: iterasi atas urutan melalui Scala untuk-pemahaman. Dengan berfokus pada konteks itu, saya percaya bahwa semantik menjadi tidak ambigu dan mudah dipikirkan.Perpustakaan tersedia di sini: https://github.com/erikerlandson/breakable
Berikut ini contoh sederhana dari apa yang tampak dalam kode:
sumber