Saya pernah mencoba menulis tentang ini, tetapi pada akhirnya saya menyerah, karena aturannya agak kabur. Pada dasarnya, Anda harus memahami itu.
Mungkin yang terbaik adalah berkonsentrasi di mana kurung kurawal dan kurung dapat digunakan secara bergantian: ketika melewati parameter ke pemanggilan metode. Anda dapat mengganti tanda kurung dengan kurung kurawal jika, dan hanya jika, metode mengharapkan parameter tunggal. Sebagai contoh:
List(1, 2, 3).reduceLeft{_ + _} // valid, single Function2[Int,Int] parameter
List{1, 2, 3}.reduceLeft(_ + _) // invalid, A* vararg parameter
Namun, masih ada lagi yang perlu Anda ketahui untuk lebih memahami aturan-aturan ini.
Peningkatan pemeriksaan kompilasi dengan parens
Para penulis dari Spray merekomendasikan round parens karena mereka memberikan peningkatan pemeriksaan kompilasi. Ini sangat penting untuk DSL seperti Spray. Dengan menggunakan parens, Anda memberi tahu kompiler bahwa itu hanya boleh diberikan satu baris; karena itu jika Anda secara tidak sengaja memberikannya dua atau lebih, itu akan mengeluh. Sekarang ini bukan masalahnya dengan kurung kurawal - jika misalnya Anda lupa operator di suatu tempat, maka kode Anda akan dikompilasi, dan Anda mendapatkan hasil yang tidak terduga dan berpotensi bug yang sangat sulit ditemukan. Di bawah ini dibuat-buat (karena ekspresinya murni dan setidaknya akan memberi peringatan), tetapi jelaskan:
method {
1 +
2
3
}
method(
1 +
2
3
)
Kompilasi pertama, yang kedua memberi error: ')' expected but integer literal found
. Penulis ingin menulis 1 + 2 + 3
.
Orang bisa berpendapat bahwa ini serupa untuk metode multi-parameter dengan argumen default; tidak mungkin untuk secara tidak sengaja melupakan koma untuk memisahkan parameter ketika menggunakan parens.
Verbositas
Catatan penting yang sering diabaikan tentang verbositas. Menggunakan kurung kurawal pasti mengarah ke kode verbose karena panduan gaya Scala dengan jelas menyatakan bahwa kurung kurawal harus berada di jalurnya sendiri:
… Kurung penutup berada pada barisnya sendiri segera setelah baris terakhir dari fungsi.
Banyak pemformat ulang otomatis, seperti di IntelliJ, akan secara otomatis melakukan pemformatan ulang ini untuk Anda. Jadi cobalah untuk tetap menggunakan parens bulat ketika Anda bisa.
Notasi Infix
Saat menggunakan notasi infiks, seperti List(1,2,3) indexOf (2)
Anda dapat menghilangkan tanda kurung jika hanya ada satu parameter dan tulis sebagai List(1, 2, 3) indexOf 2
. Ini bukan kasus notasi titik.
Perhatikan juga bahwa ketika Anda memiliki parameter tunggal yang merupakan ekspresi multi-token, seperti x + 2
atau a => a % 2 == 0
, Anda harus menggunakan tanda kurung untuk menunjukkan batas-batas ekspresi.
Tuples
Karena terkadang Anda dapat menghilangkan tanda kurung, terkadang tupel membutuhkan tanda kurung tambahan seperti dalam ((1, 2))
, dan terkadang tanda kurung luar dapat dihilangkan, seperti di (1, 2)
. Ini dapat menyebabkan kebingungan.
Function / Partial Function literals dengan case
Scala memiliki sintaks untuk fungsi dan fungsi literal fungsi. Ini terlihat seperti ini:
{
case pattern if guard => statements
case pattern => statements
}
Satu-satunya tempat lain di mana Anda dapat menggunakan case
pernyataan adalah dengan match
dan catch
kata kunci:
object match {
case pattern if guard => statements
case pattern => statements
}
try {
block
} catch {
case pattern if guard => statements
case pattern => statements
} finally {
block
}
Anda tidak dapat menggunakan case
pernyataan dalam konteks lain apa pun . Jadi, jika Anda ingin menggunakannya case
, Anda perlu kurung kurawal. Jika Anda bertanya-tanya apa yang membuat perbedaan antara fungsi dan fungsi parsial literal, jawabannya adalah: konteks. Jika Scala mengharapkan fungsi, fungsi yang Anda dapatkan. Jika mengharapkan fungsi parsial, Anda mendapatkan fungsi parsial. Jika keduanya diharapkan, ini memberikan kesalahan tentang ambiguitas.
Ekspresi dan Blok
Parenthesis dapat digunakan untuk membuat subekspresi. Kurung kurawal dapat digunakan untuk membuat blok kode (ini bukan fungsi literal, jadi berhati-hatilah untuk mencoba menggunakannya seperti satu). Blok kode terdiri dari beberapa pernyataan, yang masing-masing dapat berupa pernyataan impor, deklarasi atau ekspresi. Bunyinya seperti ini:
{
import stuff._
statement ; // ; optional at the end of the line
statement ; statement // not optional here
var x = 0 // declaration
while (x < 10) { x += 1 } // stuff
(x % 5) + 1 // expression
}
( expression )
Jadi, jika Anda membutuhkan deklarasi, banyak pernyataan, import
atau semacamnya, Anda perlu kurung kurawal. Dan karena ekspresi adalah pernyataan, tanda kurung dapat muncul di dalam kurung kurawal. Tetapi yang menarik adalah blok kode juga merupakan ekspresi, sehingga Anda dapat menggunakannya di mana saja di dalam ekspresi:
( { var x = 0; while (x < 10) { x += 1}; x } % 5) + 1
Jadi, karena ekspresi adalah pernyataan, dan blok kode adalah ekspresi, semuanya di bawah ini valid:
1 // literal
(1) // expression
{1} // block of code
({1}) // expression with a block of code
{(1)} // block of code with an expression
({(1)}) // you get the drift...
Di mana mereka tidak bisa dipertukarkan
Pada dasarnya, Anda tidak dapat mengganti {}
dengan ()
atau sebaliknya di tempat lain. Sebagai contoh:
while (x < 10) { x += 1 }
Ini bukan panggilan metode, jadi Anda tidak dapat menulisnya dengan cara lain. Nah, Anda bisa meletakkan kurung kurawal di dalam tanda kurung untuk condition
, serta menggunakan kurung kurung di dalam kurung kurawal untuk blok kode:
while ({x < 10}) { (x += 1) }
Jadi, saya harap ini membantu.