Bir kez bu konuda yazmaya çalıştım, ama kurallardan biraz dağınık olduğu için sonunda vazgeçtim. Temel olarak, asmak zorunda kalacaksınız.
Belki de kıvırcık parantezlerin ve parantezin birbirinin yerine kullanılabileceği yerlere odaklanmak en iyisidir: parametreleri yöntem çağrılarına geçirirken. Sen olabilir küme parantezleri eğer birlikte parantez değiştirin ve ancak, yöntem tek bir parametreyi bekliyor. Örneğin:
List(1, 2, 3).reduceLeft{_ + _} // valid, single Function2[Int,Int] parameter
List{1, 2, 3}.reduceLeft(_ + _) // invalid, A* vararg parameter
Ancak, bu kuralları daha iyi kavramak için bilmeniz gereken daha çok şey var.
Parenlerle artan derleme denetimi
Spray yazarları, yuvarlak dergi önermektedir çünkü daha fazla derleme kontrolü sağlarlar. Bu özellikle Sprey gibi DSL'ler için önemlidir. Parens kullanarak derleyiciye yalnızca tek bir satır verilmesi gerektiğini söylüyorsunuz; bu nedenle yanlışlıkla iki veya daha fazla verirseniz şikayet edecektir. Kıvırcık parantezler için durum böyle değil - örneğin bir yerde bir operatörü unutursanız, kodunuz derlenir ve beklenmedik sonuçlar ve potansiyel olarak bulmak çok zor bir hata alırsınız. Aşağıda (ifadeler saf olduğu ve en azından bir uyarı vereceği için) tartışılmıştır, ancak şu noktayı ifade eder:
method {
1 +
2
3
}
method(
1 +
2
3
)
Birincisi derler, ikincisi verir error: ')' expected but integer literal found
. Yazar yazmak istedi1 + 2 + 3
.
Varsayılan parametrelere sahip çok parametreli yöntemler için benzer olduğu iddia edilebilir; parenleri kullanırken parametreleri ayırmak için yanlışlıkla bir virgül unutmak imkansızdır.
lâf salatası
Ayrıntılarla ilgili önemli bir sıklıkla gözden kaçan not. Kıvırcık parantezlerin kullanılması kaçınılmaz olarak ayrıntılı koda yol açar, çünkü Scala stil kılavuzu , kıvırcık parantezlerin kapatılmasının kendi çizgisinde olması gerektiğini açıkça belirtir:
… Kapanış ayracı işlevin son satırından hemen sonra kendi satırındadır.
IntelliJ'de olduğu gibi birçok otomatik yeniden biçimlendirici bu yeniden biçimlendirmeyi sizin için otomatik olarak gerçekleştirecektir. Bu yüzden yapabildiğiniz zaman yuvarlak parens kullanmaya devam edin.
Infix Gösterimi
Infix gösterimini kullanırken, List(1,2,3) indexOf (2)
tek bir parametre varsa parantezi atlayabilir ve olarak yazabilirsiniz List(1, 2, 3) indexOf 2
. Nokta gösterimi söz konusu değildir.
Ayrıca, çok jetonlu bir ifade olan tek bir parametreniz olduğunda, x + 2
veya gibia => a % 2 == 0
sınırlarını belirtmek için parantez kullanmanız gerektiğini unutmayın.
tuples
Parantezi bazen atlayabildiğiniz için, bazen bir tuple in gibi ekstra parantezlere ihtiyaç duyar ((1, 2))
ve bazen de dış parantez atlanabilir (1, 2)
. Bu karışıklığa neden olabilir.
İşlev / Kısmi İşlev değişmezleri case
Scala işlev ve kısmi işlev değişmezleri için bir sözdizimine sahiptir. Şöyle görünüyor:
{
case pattern if guard => statements
case pattern => statements
}
case
İfadeleri kullanabileceğiniz diğer yerler match
ve catch
anahtar kelimeleriyle:
object match {
case pattern if guard => statements
case pattern => statements
}
try {
block
} catch {
case pattern if guard => statements
case pattern => statements
} finally {
block
}
case
İfadeleri başka bir bağlamda kullanamazsınız . Yani, kullanmak istiyorsanız case
, ihtiyacınız var kıvırcık parantezlere . Bir işlev ile kısmi işlev arasındaki farkı tam olarak neyin ayırdığını merak ediyorsanız, cevap şudur: bağlam. Scala bir işlev beklerse, elde ettiğiniz bir işlev. Kısmi bir işlev bekleniyorsa, kısmi bir işlev alırsınız. Her ikisi de bekleniyorsa, belirsizlik hakkında bir hata verir.
İfadeler ve Bloklar
Parantez alt ifadeleri yapmak için kullanılabilir. Kıvırcık ayraçları (bu kod bloklarını yapmak için kullanılabilir değil bu yüzden bir gibi kullanmaya çalışınca dikkat, bir fonksiyon değişmezi). Bir kod bloğu, her biri bir içe aktarma ifadesi, bir bildirim veya bir ifade olabilen birden çok ifadeden oluşur. Bu böyle devam ediyor:
{
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 )
Dolayısıyla, bildirimlere, birden çok ifadeye import
veya buna benzer bir şeye ihtiyacınız varsa, kıvırcık parantezlere ihtiyacınız vardır. Ve bir ifade bir ifade olduğu için kıvırcık parantez içinde parantez görünebilir. Ama ilginç olan kod blokları olmasıdır de her yerde kullanabilirsiniz, böylece ifadeleri içine bir ifadesi:
( { var x = 0; while (x < 10) { x += 1}; x } % 5) + 1
Dolayısıyla, ifadeler ifadeler ve kod blokları ifadeler olduğundan, aşağıdaki her şey geçerlidir:
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...
Değiştirilemedikleri yerlerde
Temel olarak, yerini alamaz {}
ile ()
veya yardımcısı başka bir yerde tersi. Örneğin:
while (x < 10) { x += 1 }
Bu bir yöntem çağrısı değildir, bu yüzden başka bir şekilde yazamazsınız. Eh, sen, kıvırcık çiftler koyabilirsiniz iç için parantez condition
kullanımı parantez yanı sıra iç kod bloğu için küme parantezleri:
while ({x < 10}) { (x += 1) }
Umarım bu yardımcı olur.