2010-08-09 11 views
5

Widziałem ten wątek:Przenoszenie nowy Iterable {} kod z Scala 2.7.7 do 2.8

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

Wydaje pokrycie pewnych zmian, ale najpierw skompilować problemy jakie dotknęły nie wydają które należy wspomnieć. Jakieś sugestie?

  • rodzaje argumentów typu (iterable [Każdy] z (A z Int) => Wszelkie) nie są zgodne z oczekiwanymi rodzaju parametrów typu (typ CC) w klasie GenericCompanion. Iterable [Any] with (A with Int) => Parametry typu Any nie pasują do oczekiwanych parametrów typu CC: nie ma parametrów typu, ale typ CC ma jedno niemożliwe utworzenie obiektu
  • , ponieważ IterableLike cecha IterableLike => iterator [java.io.File] jest niezdefiniowane
  • tworzenie przedmiotem niemożliwe, ponieważ metody iteracyjnej w cechy IterableLike typu => iterator [V], nie jest określona
  • nadrzędne elementów sposobu, w cechy IterableLike typu => Iterator [java.io.File]; method elementy wymagają modyfikatora "override"
  • nadpisanie elementów metody w funkcji IterableLike typu => Iterator [V]; metody elementów wymaga `override” modyfikujący

Oto kod w pytaniu:

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

Dostarczany z importu do pliku i globalnego podstawienia 'iterator' dla' elements', swojej kompiluje kod. –

Odpowiedz

7

Były elements jest teraz iterator.

Powinieneś skompilować z opcją -Xmigration, aby uzyskać przydatne wskazówki dotyczące przeniesienia kodu z 2.7 na 2.8.

+0

Dzięki, to było to. Wypróbuję -Xmigration –

5

Kluczem jest tutaj użycie iteratora metody z Iterable. Scala 2.8.0 również zrobiła wiele, aby upewnić się, że typy są spójne w przypadku wywołań kolekcji.

scala> val x = new Iterable[String] { 
    | def iterator = List("HAI", "YOU", "GUYS").iterator 
    | } 
x: java.lang.Object with Iterable[String] = line18(HAI, YOU, GUYS) 

Chciałbym również rozważyć użycie strumienia zamiast iteratora. Podejście iteracyjne skonstruuje cały zestaw plików podczas wywoływania metody iteratora. Strumień mógłby być leniwy.

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 
... 

Ewentualnie, jeśli chcesz dołączyć katalogi w strumieniu, spróbuj wykonać następujące czynności:

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] 
Powiązane problemy