Почему обработка шаблонов в scala не работает для циклов для сопоставления типов?
Я использую API, который дает мне доступ к удаленной файловой системе. API возвращает список файлов и каталогов в виде списка объектов узла (родительский для файла и каталога).
Я хочу работать только над каталогами, игнорируя файлы. Я пытался использовать сопоставление с шаблоном типа вfor
цикл, но он не работает:
for {
dir: CSDir <- workarea.getChildren() // <-- I'm getting an error here complaining about type conversion
} {
println(dir)
}
Вот аналогичный пример использования базовых объектов scala для запуска без зависимостей:
val listOfBaseObjects:List[Any] = List[Any]("a string", 1:Integer);
for (x: String <- listOfObjects) {
println(x)
}
Я заканчиваю тем, что использую регулярное сопоставление с образцом в цикле for, и это прекрасно работает:
// This works fien
for (child <- workarea.getChildren()) {
child match {
case dir: CSDir => println(dir)
case _ => println("do not nothing")
}
}
Question:
Можете ли вы сказать мне, почему первый / второй пример не работает в Scala 1.9?
В разделе «Программирование в Scala»for
цикл объявляется для использования того же сопоставления с шаблономmatch
так что должно работать.
Если бы for и match были разными, было бы здорово, если бы вы указали мне несколько статей с более подробной информацией. Как насчет сопоставления с образцом в назначении?
Update:Я не могу принять ответ, в котором говорится, что невозможно пропустить элементы в цикле for, поскольку это противоречит «Prog. в скале. Вот фрагмент из раздела 23.1:
pat <- expr
... The pattern pat
gets matched one-by-one against all elements of that list. ... if the match fails, no MatchError is thrown. Instead, the element is simply discarded from the iteration
и действительно, следующий пример работает просто отлично:
scala> val list = List( (1,2), 1, 3, (3,4))
scala> for ((x,y) <- list) { println (x +","+ y) }
1,2
3,4
Почему тогда сопоставление типов не работает?