Sınıf tanımları:
val
veya var
parametreyi özel yapacak sınıf parametrelerinden çıkarılabilir.
Var veya val eklenmesi, bunun halka açık olmasına neden olur (yani, yöntem erişimcileri ve mutatörler oluşturulur).
{}
sınıfın gövdesi yoksa atlanabilir, yani
class EmptyClass
Sınıf somutlaştırması:
Derleyici tarafından çıkarılabiliyorsa, genel parametreler ihmal edilebilir. Ancak, türleriniz eşleşmiyorsa, tür parametresi her zaman eşleşecek şekilde çıkarılır. Dolayısıyla, türü belirtmeden beklediğinizi alamayabilirsiniz - yani verilen
class D[T](val x:T, val y:T);
Bu size bir tür hatası verecektir (Int bulundu, beklenen String)
var zz = new D[String]("Hi1", 1) // type error
Oysa bu iyi çalışıyor:
var z = new D("Hi1", 1)
== D{def x: Any; def y: Any}
Çünkü tür parametresi, T, ikisinin en az yaygın olan süper türü olarak çıkarılır - Herhangi biri.
Fonksiyon tanımları:
=
işlev Birim (hiçbir şey) döndürürse bırakılabilir.
{}
işlev gövdesi için işlev tek bir deyimse bırakılabilir, ancak yalnızca ifade bir değer döndürürse ( =
işarete ihtiyacınız vardır ), yani,
def returnAString = "Hi!"
ama bu çalışmıyor:
def returnAString "Hi!" // Compile error - '=' expected but string literal found."
İşlevin dönüş türü, çıkarım yapılabiliyorsa ihmal edilebilir (özyinelemeli bir yöntemin dönüş türü belirtilmelidir).
()
işlev herhangi bir argüman almazsa bırakılabilir, yani,
def endOfString {
return "myDog".substring(2,1)
}
hangi geleneksel olarak yan etkisi olmayan yöntemler için ayrılmıştır - daha sonra bunun üzerine.
()
isme göre geçiş parametresi tanımlanırken aslında kendiliğinden düşülmez, ancak aslında anlamsal olarak oldukça farklı bir gösterimdir, yani,
def myOp(passByNameString: => String)
MyOp'un isme göre geçirilen bir parametre aldığını ve bunun da işlev parametrelerinin aksine bir String (yani bir dize döndüren bir kod bloğu olabilir) ile sonuçlandığını söylüyor.
def myOp(functionParam: () => String)
hangi diyor myOp
hiç parametreye sahiptir ve bir String döndüren bir işlev alır.
(Unutmayın, adıyla geçirilen parametreler işlevler halinde derlenir; yalnızca sözdizimini daha güzel kılar.)
()
İşlev yalnızca bir bağımsız değişken alırsa işlev parametresi tanımına bırakılabilir, örneğin:
def myOp2(passByNameString:(Int) => String) { .. } // - You can drop the ()
def myOp2(passByNameString:Int => String) { .. }
Ancak birden fazla argüman gerektiriyorsa, () şunu eklemelisiniz:
def myOp2(passByNameString:(Int, String) => String) { .. }
Beyanlar:
.
yalnızca infix operatörleri için kullanılabilen operatör gösterimini kullanmak için bırakılabilir (argüman alan yöntem operatörleri). Daha fazla bilgi için Daniel'in cevabına bakın .
.
sonek işlevleri listesi kuyruğu için de bırakılabilir
()
sonek operatörleri list.tail için bırakılabilir
()
şu şekilde tanımlanan yöntemlerle kullanılamaz:
def aMethod = "hi!" // Missing () on method definition
aMethod // Works
aMethod() // Compile error when calling method
Çünkü bu gösterim, List # tail gibi yan etkisi olmayan yöntemler için ayrılmıştır (yani, yan etkisi olmayan bir işlevin çağrılması, işlevin dönüş değeri dışında hiçbir gözlemlenebilir etkisinin olmadığı anlamına gelir).
()
tek bir argümandan geçerken operatör notasyonu için bırakılabilir
()
bir ifadenin sonunda olmayan sonek operatörlerini kullanmak gerekebilir
()
iç içe geçmiş ifadeleri, anonim işlevlerin sonlarını veya birden fazla parametre alan operatörler için gerekli olabilir
Bir işlevi alan bir işlevi çağırırken, () işlevini iç işlev tanımından çıkaramazsınız, örneğin:
def myOp3(paramFunc0:() => String) {
println(paramFunc0)
}
myOp3(() => "myop3") // Works
myOp3(=> "myop3") // Doesn't work
İsme göre parametre alan bir işlevi çağırırken, bağımsız değişkeni parametresiz anonim bir işlev olarak belirtemezsiniz. Örneğin, verilen:
def myOp2(passByNameString:Int => String) {
println(passByNameString)
}
Bunu şu şekilde adlandırmalısınız:
myOp("myop3")
veya
myOp({
val source = sourceProvider.source
val p = myObject.findNameFromSource(source)
p
})
Ama değil:
myOp(() => "myop3") // Doesn't work
IMO, bırakılan dönüş türlerinin aşırı kullanımı kodun yeniden kullanılması için zararlı olabilir. Koddaki açık bilgi eksikliğinden dolayı okunabilirliğin azalmasına iyi bir örnek için spesifikasyona bakın. Bir değişkenin türünün gerçekte ne olduğunu bulmak için yapılan dolaylı seviyelerin sayısı fındık olabilir. Umarım daha iyi araçlar bu sorunu önleyebilir ve kodumuzu kısa tutabilir.
(Tamam, daha eksiksiz, kısa bir cevap derleme arayışında (eğer bir şeyi kaçırdıysam veya yanlış / yanlış bir şey aldıysam lütfen yorum yapın), cevabın başına ekledim. Lütfen bunun bir dil olmadığını unutmayın şartname, bu yüzden akademik olarak tam olarak doğru yapmaya çalışmıyorum - daha çok bir referans kartı gibi.)