我正在针对一个 API 进行编码,该 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")
}
}
问题:
你能告诉我为什么第一个/第二个例子在 scala 1.9 中不起作用吗?
在“Scala 编程”中, for
循环被宣传为使用相同的模式匹配,match
因此它应该可以工作。
如果 for 和 match 不同,如果您能指出一些更详细的文章,那就太好了。分配中的模式匹配怎么样?
更新:
我不能接受一个回答说不可能跳过 for 循环中的元素,因为这与“Prog. in scala”相矛盾。这是第 23.1 节的一个片段:
pat <- expr
...该模式pat
与该列表的所有元素一一匹配。...如果匹配失败,则不会抛出 MatchError。相反,该元素只是从迭代中丢弃
事实上,下面的例子工作得很好:
scala> val list = List( (1,2), 1, 3, (3,4))
scala> for ((x,y) <- list) { println (x +","+ y) }
1,2
3,4
为什么类型匹配不起作用?