Por que a usinagem de padrões de scala não funciona em loops para correspondência de tipos?
Estou codificando contra uma API que me dá acesso ao sistema de arquivos remoto. A API retorna uma lista de arquivos e diretórios como lista de objetos de nó (pai para arquivo e diretório).
Eu quero trabalhar apenas em um diretório, ignorando arquivos. Eu tentei usar correspondência de padrão de tipo emfor
loop mas não funciona:
for {
dir: CSDir <- workarea.getChildren() // <-- I'm getting an error here complaining about type conversion
} {
println(dir)
}
Aqui está um exemplo semelhante usando objetos básicos scala para executá-lo sem dependências:
val listOfBaseObjects:List[Any] = List[Any]("a string", 1:Integer);
for (x: String <- listOfObjects) {
println(x)
}
Acabo usando uma correspondência regular de padrões no lado do loop for e isso funciona bem:
// This works fien
for (child <- workarea.getChildren()) {
child match {
case dir: CSDir => println(dir)
case _ => println("do not nothing")
}
}
Questão:Você pode me dizer por que o primeiro / segundo exemplo não funciona no scala 1.9?
Na "Programação em Scala" ofor
loop é anunciado para usar o mesmo padrão de correspondência que omatch
então deve funcionar.
Se o for e o match forem diferentes, seria ótimo se você pudesse me indicar alguns artigos com mais detalhes. E quanto a correspondência de padrões na atribuição?
Atualizar:Eu não posso aceitar uma resposta que afirma que é impossível pular elementos em loop, pois isso contradiz com o "Prog. In scala". Aqui está um fragmento da seção 23.1:
pat <- expr
... O padrãopat
é correspondido um a um contra todos os elementos dessa lista. ... se a partida falhar, nenhum MatchError será lançado. Em vez disso, o elemento é simplesmente descartado da iteração
e, de fato, o exemplo a seguir funciona bem:
scala> val list = List( (1,2), 1, 3, (3,4))
scala> for ((x,y) <- list) { println (x +","+ y) }
1,2
3,4
Por que então a correspondência de tipos não funciona?