代码之家  ›  专栏  ›  技术社区  ›  waterlooalex

将新的Iterable{}代码从scala2.7.7移植到2.8

  •  5
  • waterlooalex  · 技术社区  · 14 年前

    我看到这条线:

    What are the biggest differences between Scala 2.8 and Scala 2.7?

    它似乎涵盖了一些变化,但我遇到的第一个编译问题似乎没有被提及。有什么建议吗?

    • 类型参数的种类(Iterable[Any]with(A with Int)=>Any)不符合类GenericCompanion中类型参数(类型CC)的预期类型。Iterable[Any]with(A with Int)=>Any的类型参数与CC类型的预期参数不匹配:没有类型参数,但CC类型有一个
    • 无法创建对象,因为 类型=>迭代器[java.io.File]是 未定义
    • 特征IterableLike中的方法迭代器 类型=>未定义迭代器[V]
    • 重写trait中的方法元素 类型的IterableLike=> 迭代器[java.io.File]; 方法 元素需要“override”修饰符
    • 重写trait中的方法元素 类型的IterableLike=>迭代器; 方法元素需要“重写” 修饰语

    /**
     * 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
          }
        }
      }
    }
    
    2 回复  |  直到 8 年前
        1
  •  7
  •   Randall Schulz    14 年前

    前者 elements 是现在 iterator .

        2
  •  5
  •   jsuereth    14 年前

    这里的关键是确保将方法迭代器与Iterable一起使用。Scala2.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)
    

    我也会考虑使用流而不是迭代器。迭代器方法将在调用迭代器方法时构造整个文件集。一条小溪可能是懒洋洋的。

    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]