Saya membagi operator, untuk tujuan pengajaran, menjadi empat kategori :
- Kata kunci / simbol yang dicadangkan
- Metode yang diimpor secara otomatis
- Metode umum
- Gula / komposisi sintaksis
Untungnya, sebagian besar kategori terwakili dalam pertanyaan:
-> // Automatically imported method
||= // Syntactic sugar
++= // Syntactic sugar/composition or common method
<= // Common method
_._ // Typo, though it's probably based on Keyword/composition
:: // Common method
:+= // Common method
Arti yang tepat dari sebagian besar metode ini tergantung pada kelas yang mendefinisikannya. Misalnya, <=
pada Int
berarti "kurang dari atau sama dengan" . Yang pertama ->
,, saya akan berikan contoh di bawah ini. ::
mungkin adalah metode yang didefinisikan List
(meskipun itu bisa menjadi objek dengan nama yang sama), dan :+=
mungkin metode yang didefinisikan pada berbagai Buffer
kelas.
Jadi, mari kita lihat.
Kata kunci / simbol yang dicadangkan
Ada beberapa simbol dalam Scala yang spesial. Dua di antaranya dianggap kata kunci yang tepat, sementara yang lain hanya "dipesan". Mereka:
// Keywords
<- // Used on for-comprehensions, to separate pattern from generator
=> // Used for function types, function literals and import renaming
// Reserved
( ) // Delimit expressions and parameters
[ ] // Delimit type parameters
{ } // Delimit blocks
. // Method call and path separator
// /* */ // Comments
# // Used in type notations
: // Type ascription or context bounds
<: >: <% // Upper, lower and view bounds
<? <! // Start token for various XML elements
" """ // Strings
' // Indicate symbols and characters
@ // Annotations and variable binding on pattern matching
` // Denote constant or enable arbitrary identifiers
, // Parameter separator
; // Statement separator
_* // vararg expansion
_ // Many different meanings
Ini semua adalah bagian dari bahasa , dan, dengan demikian, dapat ditemukan dalam teks apa pun yang menggambarkan bahasa dengan benar, seperti Spesifikasi Scala (PDF) itu sendiri.
Yang terakhir, garis bawah, layak mendapat deskripsi khusus, karena sangat banyak digunakan, dan memiliki banyak arti berbeda. Berikut ini contohnya:
import scala._ // Wild card -- all of Scala is imported
import scala.{ Predef => _, _ } // Exception, everything except Predef
def f[M[_]] // Higher kinded type parameter
def f(m: M[_]) // Existential type
_ + _ // Anonymous function placeholder parameter
m _ // Eta expansion of method into method value
m(_) // Partial function application
_ => 5 // Discarded parameter
case _ => // Wild card pattern -- matches anything
f(xs: _*) // Sequence xs is passed as multiple parameters to f(ys: T*)
case Seq(xs @ _*) // Identifier xs is bound to the whole matched sequence
Tapi saya mungkin lupa arti lain.
Metode yang diimpor secara otomatis
Jadi, jika Anda tidak menemukan simbol yang Anda cari dalam daftar di atas, maka itu harus berupa metode, atau bagian dari satu. Tetapi, seringkali, Anda akan melihat beberapa simbol dan dokumentasi untuk kelas tidak akan memiliki metode itu. Ketika ini terjadi, apakah Anda melihat komposisi dari satu metode atau lebih dengan sesuatu yang lain, atau metode tersebut telah diimpor ke dalam ruang lingkup, atau tersedia melalui konversi implisit yang diimpor.
Ini masih dapat ditemukan di ScalaDoc : Anda hanya harus tahu di mana mencarinya. Atau, gagal itu, lihat indeks (saat ini rusak pada 2.9.1, tetapi tersedia pada malam hari).
Setiap kode Scala memiliki tiga impor otomatis:
// Not necessarily in this order
import _root_.java.lang._ // _root_ denotes an absolute path
import _root_.scala._
import _root_.scala.Predef._
Dua yang pertama hanya menyediakan kelas dan objek tunggal. Yang ketiga berisi semua konversi implisit dan metode yang diimpor, karena Predef
merupakan objek itu sendiri.
Melihat ke dalam Predef
dengan cepat menunjukkan beberapa simbol:
class <:<
class =:=
object <%<
object =:=
Simbol lain apa pun akan disediakan melalui konversi tersirat . Lihat saja metode yang ditandai dengan implicit
yang menerima, sebagai parameter, objek bertipe yang menerima metode. Sebagai contoh:
"a" -> 1 // Look for an implicit from String, AnyRef, Any or type parameter
Dalam kasus di atas, ->
didefinisikan dalam kelas ArrowAssoc
melalui metode any2ArrowAssoc
yang mengambil objek bertipe A
, di mana A
parameter tipe tidak terikat ke metode yang sama.
Metode umum
Jadi, banyak simbol hanyalah metode di kelas. Misalnya, jika Anda melakukannya
List(1, 2) ++ List(3, 4)
Anda akan menemukan metode ini ++
tepat di ScalaDoc untuk Daftar . Namun, ada satu konvensi yang harus Anda waspadai saat mencari metode. Metode yang berakhir dengan titik dua ( :
) mengikat ke kanan, bukan ke kiri. Dengan kata lain, sementara pemanggilan metode di atas setara dengan:
List(1, 2).++(List(3, 4))
Sebaliknya 1 :: List(2, 3)
, jika saya memiliki , itu akan setara dengan:
List(2, 3).::(1)
Jadi, Anda perlu melihat jenis yang ditemukan di sebelah kanan ketika mencari metode yang berakhir dengan titik dua. Pertimbangkan, misalnya:
1 +: List(2, 3) :+ 4
Metode pertama ( +:
) mengikat ke kanan, dan ditemukan pada List
. Metode kedua ( :+
) hanyalah metode normal, dan mengikat ke kiri - lagi, pada List
.
Gula / komposisi sintaksis
Jadi, inilah beberapa gula sintaksis yang mungkin menyembunyikan metode:
class Example(arr: Array[Int] = Array.fill(5)(0)) {
def apply(n: Int) = arr(n)
def update(n: Int, v: Int) = arr(n) = v
def a = arr(0); def a_=(v: Int) = arr(0) = v
def b = arr(1); def b_=(v: Int) = arr(1) = v
def c = arr(2); def c_=(v: Int) = arr(2) = v
def d = arr(3); def d_=(v: Int) = arr(3) = v
def e = arr(4); def e_=(v: Int) = arr(4) = v
def +(v: Int) = new Example(arr map (_ + v))
def unapply(n: Int) = if (arr.indices contains n) Some(arr(n)) else None
}
val Ex = new Example // or var for the last example
println(Ex(0)) // calls apply(0)
Ex(0) = 2 // calls update(0, 2)
Ex.b = 3 // calls b_=(3)
// This requires Ex to be a "val"
val Ex(c) = 2 // calls unapply(2) and assigns result to c
// This requires Ex to be a "var"
Ex += 1 // substituted for Ex = Ex + 1
Yang terakhir menarik, karena metode simbolis apa pun dapat digabungkan untuk membentuk metode penugasan seperti itu.
Dan, tentu saja, ada berbagai kombinasi yang dapat muncul dalam kode:
(_+_) // An expression, or parameter, that is an anonymous function with
// two parameters, used exactly where the underscores appear, and
// which calls the "+" method on the first parameter passing the
// second parameter as argument.