Karena baru mengenal Scala (2.9.1), saya memiliki List[Event]
dan ingin menyalinnya ke a Queue[Event]
, tetapi Sintaks berikut menghasilkan aQueue[List[Event]]
:
val eventQueue = Queue(events)
Untuk beberapa alasan, berikut ini berfungsi:
val eventQueue = Queue(events : _*)
Tapi saya ingin memahami apa fungsinya, dan mengapa itu berhasil? Saya sudah melihat tanda tangan dariQueue.apply
fungsinya:
def apply[A](elems: A*)
Dan saya mengerti mengapa upaya pertama tidak berhasil, tetapi apa arti upaya kedua? Apa :
, dan _*
dalam kasus ini, dan mengapa fungsinya tidak apply
mengambil begitu saja Iterable[A]
?
sumber
def sum(xs: _*)
melempar 'kesalahan: jenis wildcard tidak terikat'xs: int
berarti tipe xs adalah int, dengan itu adalah sintaks di atas dalam scala di manaxs: _*
cara xs dicor ke masing-masing anggota.def sum(args: Int*)
dan Anda menyebutnya dengan wildcard jenis "generik" var-args:val a = sum(xs: _*)
. Anggap saja_*
sebagai "Saya meneruskan Int *, atau String *, atau apa pun * yang ditentukan dalam tanda tangan metode"Untuk orang-orang Python:
Operator Scala
_*
kurang lebih setara dengan * -operator Python .Contoh
Mengonversi contoh skala dari tautan yang disediakan oleh Luigi Plinge :
def echo(args: String*) = for (arg <- args) println(arg) val arr = Array("What's", "up", "doc?") echo(arr: _*)
ke Python akan terlihat seperti:
def echo(*args): for arg in args: print "%s" % arg arr = ["What's", "up", "doc?"] echo(*arr)
dan keduanya memberikan hasil sebagai berikut:
Perbedaannya: membongkar parameter posisi
Sedangkan Python
*
-operator juga dapat menangani pembongkaran parameter / parameter posisi untuk fungsi fixed-arity:def multiply (x, y): return x * y operands = (2, 4) multiply(*operands)
Melakukan hal yang sama dengan Scala:
def multiply(x:Int, y:Int) = { x * y; } val operands = (2, 4) multiply (operands : _*)
akan gagal:
Tetapi dimungkinkan untuk mencapai hal yang sama dengan scala:
def multiply(x:Int, y:Int) = { x*y; } val operands = (2, 4) multiply _ tupled operands
Menurut Lorrin Nelson inilah cara kerjanya:
Bacaan selanjutnya:
sumber