Портирование нового кода Iterable {} из Scala 2.7.7 в 2.8 - PullRequest
5 голосов
/ 10 августа 2010

Я видел эту тему:

Каковы самые большие различия между Scala 2.8 и Scala 2.7?

Кажется, что это касается некоторых изменений, но первые проблемы с компиляцией, о которых я упоминал, похоже, не упоминаются. Есть предложения?

  • виды аргументов типа (Iterable [Any] с (A с Int) => Any) не соответствуют ожидаемым типам параметров типа (тип CC) в классе GenericCompanion. Итерируемый [Любой] с (A с Int) => Параметры любого типа не соответствуют ожидаемым параметрам типа CC: не имеет параметров типа, но тип CC имеет один
  • создание объекта невозможно, т.к. Метод итератор в черте IterableLike типа => Iterator [java.io.File] is не определено
  • создание объекта невозможно, т.к. Метод итератор в черте IterableLike типа => Итератор [V] не определен
  • переопределение элементов метода в черте IterableLike типа => Итератор [java.io.File]; метод элементам нужен модификатор override
  • переопределение элементов метода в черте IterableLike типа => Iterator [V]; элементы метода нуждаются в переопределении Модификатор

Вот код, о котором идет речь:

/**
 * 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 ]

7 голосов
/ 10 августа 2010

Прежний elements теперь iterator.

Вы должны скомпилировать с -Xmigration для полезных советов о том, как переносить код с 2,7 на 2,8.

5 голосов
/ 10 августа 2010

Здесь ключ к тому, чтобы убедиться, что вы используете итератор метода с 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]
...