Definisi kelas:
val
atau var
dapat dihilangkan dari parameter kelas yang akan membuat parameter menjadi pribadi.
Menambahkan var atau val akan membuatnya menjadi publik (yaitu, pengakses metode dan mutator dihasilkan).
{}
dapat dihilangkan jika kelas tidak memiliki tubuh, yaitu,
class EmptyClass
Instansiasi kelas:
Parameter umum dapat dihilangkan jika dapat disimpulkan oleh kompilator. Namun perhatikan, jika tipe Anda tidak cocok, parameter tipe selalu disimpulkan sehingga cocok. Jadi tanpa menentukan jenisnya, Anda mungkin tidak mendapatkan apa yang Anda harapkan - yaitu, diberikan
class D[T](val x:T, val y:T);
Ini akan memberi Anda kesalahan tipe (Int ditemukan, String yang diharapkan)
var zz = new D[String]("Hi1", 1) // type error
Padahal ini berfungsi dengan baik:
var z = new D("Hi1", 1)
== D{def x: Any; def y: Any}
Karena parameter type, T, disimpulkan sebagai supertipe paling umum dari keduanya - Any.
Definisi fungsi:
=
bisa dihapus jika fungsi mengembalikan Unit (tidak ada).
{}
untuk badan fungsi dapat dihapus jika fungsinya adalah pernyataan tunggal, tetapi hanya jika pernyataan tersebut mengembalikan nilai (Anda memerlukan =
tanda), yaitu,
def returnAString = "Hi!"
tapi ini tidak berhasil:
def returnAString "Hi!" // Compile error - '=' expected but string literal found."
Tipe kembalian dari fungsi bisa dihilangkan jika bisa disimpulkan (metode rekursif harus memiliki tipe kembalian yang ditentukan).
()
dapat dihapus jika fungsi tidak mengambil argumen apa pun, yaitu,
def endOfString {
return "myDog".substring(2,1)
}
yang menurut konvensi disediakan untuk metode yang tidak memiliki efek samping - lebih lanjut nanti.
()
tidak benar-benar dijatuhkan saat menentukan parameter pass by name , tetapi sebenarnya ini adalah notasi yang sangat berbeda secara semantik, yaitu,
def myOp(passByNameString: => String)
Mengatakan myOp mengambil parameter pass-by-name, yang menghasilkan String (yaitu, ini bisa menjadi blok kode yang mengembalikan string) sebagai lawan parameter fungsi,
def myOp(functionParam: () => String)
yang mengatakan myOp
mengambil fungsi yang memiliki parameter nol dan mengembalikan String.
(Pikiran Anda, parameter pass-by-name dikompilasi menjadi fungsi; itu hanya membuat sintaks lebih baik.)
()
dapat dijatuhkan dalam definisi parameter fungsi jika fungsi hanya mengambil satu argumen, misalnya:
def myOp2(passByNameString:(Int) => String) { .. } // - You can drop the ()
def myOp2(passByNameString:Int => String) { .. }
Tetapi jika dibutuhkan lebih dari satu argumen, Anda harus menyertakan ():
def myOp2(passByNameString:(Int, String) => String) { .. }
Pernyataan:
.
dapat dijatuhkan untuk menggunakan notasi operator, yang hanya dapat digunakan untuk operator infix (operator metode yang mengambil argumen). Lihat jawaban Daniel untuk informasi lebih lanjut.
.
dapat juga dibuang untuk ekor daftar fungsi postfix
()
dapat dijatuhkan untuk operator postfix list.tail
()
tidak dapat digunakan dengan metode yang didefinisikan sebagai:
def aMethod = "hi!" // Missing () on method definition
aMethod // Works
aMethod() // Compile error when calling method
Karena notasi ini dicadangkan oleh konvensi untuk metode yang tidak memiliki efek samping, seperti List # tail (yaitu, pemanggilan fungsi tanpa efek samping berarti bahwa fungsi tersebut tidak memiliki efek yang dapat diamati, kecuali untuk nilai kembaliannya).
()
bisa dihapus untuk notasi operator saat meneruskan argumen tunggal
()
mungkin diperlukan untuk menggunakan operator postfix yang tidak ada di akhir pernyataan
()
mungkin diperlukan untuk menetapkan pernyataan bertingkat, ujung fungsi anonim atau untuk operator yang mengambil lebih dari satu parameter
Saat memanggil fungsi yang mengambil suatu fungsi, Anda tidak bisa menghilangkan () dari definisi fungsi bagian dalam, misalnya:
def myOp3(paramFunc0:() => String) {
println(paramFunc0)
}
myOp3(() => "myop3") // Works
myOp3(=> "myop3") // Doesn't work
Saat memanggil fungsi yang menggunakan parameter dengan nama, Anda tidak bisa menentukan argumen sebagai fungsi anonim tanpa parameter. Misalnya, diberikan:
def myOp2(passByNameString:Int => String) {
println(passByNameString)
}
Anda harus menyebutnya sebagai:
myOp("myop3")
atau
myOp({
val source = sourceProvider.source
val p = myObject.findNameFromSource(source)
p
})
tapi tidak:
myOp(() => "myop3") // Doesn't work
IMO, terlalu sering menggunakan jenis pengembalian yang hilang dapat berbahaya bagi kode untuk digunakan kembali. Lihat saja spesifikasi untuk contoh yang baik tentang keterbacaan yang berkurang karena kurangnya informasi eksplisit dalam kode. Jumlah tingkat tipuan untuk benar-benar mencari tahu apa jenis variabel itu bisa jadi gila. Semoga alat yang lebih baik dapat mencegah masalah ini dan menjaga kode kita tetap ringkas.
(Oke, dalam pencarian untuk mengumpulkan jawaban yang lebih lengkap dan ringkas (jika saya melewatkan sesuatu, atau mendapatkan sesuatu yang salah / tidak akurat tolong beri komentar), saya telah menambahkan di awal jawaban. Harap dicatat ini bukan bahasa spesifikasi, jadi saya tidak mencoba membuatnya tepat secara akademis - hanya lebih seperti kartu referensi.)