Apa aturan yang tepat saat Anda dapat menghilangkan (menghilangkan) tanda kurung, titik, tanda kurung, = (fungsi), dll.?
Sebagai contoh,
(service.findAllPresentations.get.first.votes.size) must be equalTo(2).
service
adalah objek sayadef findAllPresentations: Option[List[Presentation]]
votes
kembaliList[Vote]
- must dan be adalah fungsi dari spesifikasi
Mengapa saya tidak bisa pergi:
(service findAllPresentations get first votes size) must be equalTo(2)
?
Kesalahan kompilernya adalah:
"RestServicesSpecTest.this.service.findAllPresentations dari tipe Option [Daftar [com.sharca.Presentation]] tidak mengambil parameter"
Mengapa saya berpikir saya mencoba meneruskan parameter? Mengapa saya harus menggunakan titik untuk setiap pemanggilan metode?
Why must (service.findAllPresentations get first votes size)
be equalTo (2) menghasilkan:
"tidak ditemukan: nilai dulu"
Namun, "must be equalTo 2" dari
(service.findAllPresentations.get.first.votes.size)
must be equalTo 2, yaitu, metode rangkaian berfungsi dengan baik? - parameter rantai rantai objek.
Saya telah melihat-lihat buku dan situs web Scala dan tidak dapat menemukan penjelasan yang lengkap.
Benarkah, seperti yang dijelaskan Rob H dalam pertanyaan Stack Overflow Karakter mana yang dapat saya hilangkan di Scala? , bahwa satu-satunya kasus penggunaan yang valid untuk menghilangkan '.' adalah untuk operasi gaya "operan operator operan", dan bukan untuk rangkaian metode?
Definisi kelas:
val
atauvar
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,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
Ini akan memberi Anda kesalahan tipe (Int ditemukan, String yang diharapkan)
Padahal ini berfungsi dengan baik:
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,tapi ini tidak berhasil:
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,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,Mengatakan myOp mengambil parameter pass-by-name, yang menghasilkan String (yaitu, ini bisa menjadi blok kode yang mengembalikan string) sebagai lawan parameter fungsi,
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:Tetapi jika dibutuhkan lebih dari satu argumen, Anda harus menyertakan ():
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: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 parameterSaat memanggil fungsi yang mengambil suatu fungsi, Anda tidak bisa menghilangkan () dari definisi fungsi bagian dalam, misalnya:
Saat memanggil fungsi yang menggunakan parameter dengan nama, Anda tidak bisa menentukan argumen sebagai fungsi anonim tanpa parameter. Misalnya, diberikan:
Anda harus menyebutnya sebagai:
atau
tapi tidak:
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.)
sumber
Kumpulan kutipan yang memberikan wawasan tentang berbagai kondisi ...
Secara pribadi, saya pikir akan ada lebih banyak spesifikasi. Saya yakin pasti ada, saya hanya tidak mencari kata-kata yang tepat ...
Namun ada beberapa sumber, dan saya telah mengumpulkannya bersama-sama, tetapi tidak ada yang benar-benar lengkap / komprehensif / dapat dimengerti / yang menjelaskan masalah di atas kepada saya ...:
Dari bab 2, "Type Less, Do More", dari Programming Scala :
Dari bab 1, "Zero to Sixty: Introducing Scala", dari Programming Scala :
Dari entri blog Scala Syntax Primer :
Dari spesifikasi bahasa:
From Scala for Java Refugees Part 6: Getting Over Java :
Karakter mana yang dapat saya hilangkan di Scala?
Tapi yang juga membingungkan saya adalah kutipan ini:
Karena sejauh yang saya bisa melihat, ada adalah sebuah objek untuk menerima panggilan ...
sumber
Saya merasa lebih mudah untuk mengikuti aturan praktis ini: dalam ruang ekspresi bergantian antara metode dan parameter. Dalam contoh Anda,
(service.findAllPresentations.get.first.votes.size) must be equalTo(2)
parsing sebagai(service.findAllPresentations.get.first.votes.size).must(be)(equalTo(2))
. Perhatikan bahwa tanda kurung di sekitar 2 memiliki asosiasi yang lebih tinggi daripada spasi. Titik juga memiliki asosiatif yang lebih tinggi, sehingga(service.findAllPresentations.get.first.votes.size) must be.equalTo(2)
akan diuraikan sebagai(service.findAllPresentations.get.first.votes.size).must(be.equalTo(2))
.service findAllPresentations get first votes size must be equalTo 2
mengurai sebagaiservice.findAllPresentations(get).first(votes).size(must).be(equalTo).2
.sumber
Sebenarnya, pada bacaan kedua, mungkin ini kuncinya:
Seperti yang disebutkan di postingan blog: http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6 .
Jadi mungkin ini sebenarnya adalah "gula sintaks" yang sangat ketat yang hanya berfungsi saat Anda secara efektif memanggil metode, pada objek, yang menggunakan satu parameter . misalnya
Dan tidak ada lagi.
Ini akan menjelaskan contoh saya dalam pertanyaan tersebut.
Tapi seperti yang saya katakan, jika seseorang bisa menunjukkan dengan tepat di mana dalam spesifikasi bahasa ini ditentukan, akan sangat dihargai.
Ok, beberapa orang baik (paulp_ dari #scala) telah menunjukkan di mana dalam spesifikasi bahasa informasi ini:
Hmm - bagi saya itu tidak sesuai dengan apa yang saya lihat atau saya hanya tidak memahaminya;)
sumber
Tidak ada. Anda kemungkinan akan menerima saran seputar apakah fungsi tersebut memiliki efek samping atau tidak. Ini palsu. Koreksi adalah untuk tidak menggunakan efek samping sejauh diizinkan oleh Scala. Sejauh tidak bisa, maka semua taruhan dibatalkan. Semua taruhan. Menggunakan tanda kurung adalah elemen dari himpunan "semua" dan tidak berguna. Itu tidak memberikan nilai apa pun setelah semua taruhan dibatalkan.
Saran ini pada dasarnya merupakan upaya pada sistem efek yang gagal (jangan disamakan dengan: kurang berguna dibandingkan sistem efek lainnya).
Cobalah untuk tidak memberikan efek samping. Setelah itu, terimalah bahwa semua taruhan dibatalkan. Bersembunyi di balik notasi sintaksis de facto untuk sistem efek dapat dan tidak, hanya menyebabkan kerusakan.
sumber