2010-08-09 5 views
5

J'ai vu ce fil:nouveau Iterable {portage} Code de Scala 2.7.7 à 2.8

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

Il semble couvrir quelques changements, mais la première compilation des problèmes que j'ai frappé ne semblent pas être mentionné. Aucune suggestion?

  • types des arguments de type (itératifs [Tout] avec (A avec Int) => Any) ne sont pas conformes aux types des paramètres de type attendu (type CC) en classe GenericCompanion. Iterable [Tout] avec (A avec Int) => Les paramètres de type de Tout ne correspondent pas aux paramètres attendus Type CC: n'a pas de paramètres de type, mais le type CC a un
  • création d'un objet impossible, puisque méthode iterator en trait IterableLike de type => itérateur [java.io.File] est pas défini
  • création de l'objet impossible, puisque procédé itérateur en trait IterableLike de type => itérateur [V] est défini
  • éléments de méthode impérieuses trait IterableLike de type => Iterator [java.io.File]; méthode éléments nécessitant un modificateur 'override'
  • éléments de méthode de substitution dans le trait IterableLike de type => Iterator [V]; éléments de méthode a besoin modificateur `override »

Voici le code en question:

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

Livré avec une importation de fichiers et avec une substitution globale de '' iterator' pour elements', votre compile de code. –

Répondre

7

L'ancien elements est maintenant iterator.

Vous devriez compiler avec -Xmigration pour obtenir des conseils utiles sur la façon de porter votre code de 2.7 à 2.8.

+0

Merci, c'était ça. Je vais essayer -Xmigration –

5

La clé ici est de s'assurer que vous utilisez la méthode itérateur avec Iterable. Scala 2.8.0 a également fait beaucoup pour s'assurer que les types sont cohérents entre les appels de collection.

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

Je considérerais également l'utilisation d'un flux au lieu d'un itérateur. L'approche itérateur construira l'ensemble des fichiers lors de l'appel de la méthode itérateur. Un flux pourrait être paresseux.

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

Sinon, si vous voulez inclure des répertoires dans le flux, effectuez les opérations suivantes:

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] 
Questions connexes