Para o pessoal do Python:
O _*
operador do Scala é mais ou menos equivalente ao operador * do Python .
Exemplo
Convertendo o exemplo de scala do link fornecido por Luigi Plinge :
def echo(args: String*) =
for (arg <- args) println(arg)
val arr = Array("What's", "up", "doc?")
echo(arr: _*)
para Python seria semelhante a:
def echo(*args):
for arg in args:
print "%s" % arg
arr = ["What's", "up", "doc?"]
echo(*arr)
e ambos fornecem a seguinte saída:
O que
se
passa doc?
A diferença: desempacotando parâmetros posicionais
Embora o *
operador do Python também possa lidar com o desempacotamento de parâmetros / parâmetros posicionais para funções de aridade fixa:
def multiply (x, y):
return x * y
operands = (2, 4)
multiply(*operands)
8
Fazendo o mesmo com Scala:
def multiply(x:Int, y:Int) = {
x * y;
}
val operands = (2, 4)
multiply (operands : _*)
vai falhar:
argumentos insuficientes para o método multiply: (x: Int, y: Int) Int.
Parâmetro de valor não especificado y.
Mas é possível conseguir o mesmo com o scala:
def multiply(x:Int, y:Int) = {
x*y;
}
val operands = (2, 4)
multiply _ tupled operands
De acordo com Lorrin Nelson, é assim que funciona:
A primeira parte, f _, é a sintaxe para uma função parcialmente aplicada na qual nenhum dos argumentos foi especificado. Isso funciona como um mecanismo para obter o objeto de função. tupled retorna uma nova função which of arity-1 que leva uma única tupla arity-n.
Leitura futura:
def sum(xs: _*)
lança 'erro: tipo curinga desvinculado'