我看到了这个帖子:
What are the biggest differences between Scala 2.8 and Scala 2.7?
它似乎涵盖了一些变化,但似乎没有提到我遇到的第一个编译问题。有什么建议吗?
以下是相关代码:
/**
* Filesystem walker.
* <p>
* Less magic version of: http://rosettacode.org/wiki/Walk_Directory_Tree#Scala
*/
object FsWalker {
/**
* Recursive iterator over all files (and directories) in given directory.
*/
def walk(f: File): Iterable[File] = new Iterable[File] {
def elements = {
if (f.isDirectory()) {
// recurse on our child files
f.listFiles.elements.flatMap(child => FsWalker.walk(child).elements)
} else {
// just return given file wrapped in Iterator
Seq(f).elements
}
}
}
}
答案 0 :(得分:7)
前一个elements
现在是iterator
。
您应该使用-Xmigration进行编译,以获取有关如何将代码从2.7移植到2.8的有用提示。
答案 1 :(得分:5)
这里的关键是确保将方法迭代器与Iterable一起使用。 Scala 2.8.0也做了很多工作,以确保类型在集合调用中保持一致。
scala> val x = new Iterable[String] {
| def iterator = List("HAI", "YOU", "GUYS").iterator
| }
x: java.lang.Object with Iterable[String] = line18(HAI, YOU, GUYS)
我还会考虑使用Stream而不是迭代器。迭代器方法将在调用迭代器方法时构造整个文件集。流可能很懒。
scala> def files(f : File) : Stream[File] = {
| if(f.isDirectory) {
| f.listFiles.toStream.map(files).flatten
| } else Stream(f)
| }
files: (f: java.io.File)Stream[java.io.File]
scala> files(new File("/home/jsuereth/projects/scala/scala"))
res1: Stream[java.io.File] = Stream(/home/jsuereth/projects/scala/scala/build/manmaker/classes/scala/man1/sbaz.class, ?)
scala> res1 take 10 foreach println
/home/jsuereth/projects/scala/scala/build/manmaker/classes/scala/man1/sbaz.class
/home/jsuereth/projects/scala/scala/build/manmaker/classes/scala/man1/scala$$anon$1.class
...
或者,如果要在流中包含目录,请尝试以下操作:
scala> def files_with_dirs(f : File) : Stream[File] = {
| if(f.isDirectory) Stream.cons(f, f.listFiles.toStream.map(files).flatten)
| else Stream(f)
| }
files_with_dirs: (f: java.io.File)Stream[java.io.File]