Sendo novo no Scala (2.9.1), tenho um List[Event]
e gostaria de copiá-lo para um Queue[Event]
, mas a seguinte sintaxe produz um em Queue[List[Event]]
vez disso:
val eventQueue = Queue(events)
Por algum motivo, o seguinte funciona:
val eventQueue = Queue(events : _*)
Mas gostaria de entender o que ele faz e por que funciona? Já olhei a assinatura da Queue.apply
função:
def apply[A](elems: A*)
E eu entendo porque a primeira tentativa não funciona, mas qual é o significado da segunda? O que é :
e _*
, neste caso, e por que a apply
função simplesmente não assume um Iterable[A]
?
fonte
def sum(xs: _*)
lança 'erro: tipo curinga desvinculado'xs: int
significa que o tipo de xs é int, o que está acima é uma sintaxe em scala onde osxs: _*
meios xs são lançados para seus membros individuais.def sum(args: Int*)
e você chamá-lo com o curinga tipo "genéricos" var-args:val a = sum(xs: _*)
. Pense_*
como "Estou passando um Int *, ou uma String *, ou qualquer coisa * que esteja definida na assinatura do método"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:
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)
Fazendo o mesmo com Scala:
def multiply(x:Int, y:Int) = { x * y; } val operands = (2, 4) multiply (operands : _*)
vai falhar:
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:
Leitura futura:
fonte