Per le persone di Python:
L' _*
operatore di Scala è più o meno l'equivalente dell'operatore * di Python .
Esempio
Conversione dell'esempio scala dal collegamento fornito da Luigi Plinge :
def echo(args: String*) =
for (arg <- args) println(arg)
val arr = Array("What's", "up", "doc?")
echo(arr: _*)
a Python sarebbe simile a:
def echo(*args):
for arg in args:
print "%s" % arg
arr = ["What's", "up", "doc?"]
echo(*arr)
ed entrambi danno il seguente output:
Che cosa è
up
doc?
La differenza: spacchettare i parametri posizionali
Mentre l' *
operatore di Python può anche occuparsi dello spacchettamento di parametri / parametri posizionali per funzioni ad arità fissa:
def multiply (x, y):
return x * y
operands = (2, 4)
multiply(*operands)
8
Fare lo stesso con Scala:
def multiply(x:Int, y:Int) = {
x * y;
}
val operands = (2, 4)
multiply (operands : _*)
avrà esito negativo:
non abbastanza argomenti per il metodo moltiplicare: (x: Int, y: Int) Int.
Parametro di valore non specificato y.
Ma è possibile ottenere lo stesso con scala:
def multiply(x:Int, y:Int) = {
x*y;
}
val operands = (2, 4)
multiply _ tupled operands
Secondo Lorrin Nelson è così che funziona:
La prima parte, f _, è la sintassi per una funzione parzialmente applicata in cui nessuno degli argomenti è stato specificato. Questo funziona come un meccanismo per ottenere una presa dell'oggetto funzione. tupled restituisce una nuova funzione quale di arity-1 che accetta una singola tupla arity-n.
Ulteriore lettura:
def sum(xs: _*)
genera "errore: tipo di carattere jolly non