2010-08-09 47 views
5

我看到這個線程:從斯卡拉2.7.7移植新的Iterable {}代碼2.8

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

這似乎掩蓋了一些變化,但首先編譯我已經打了似乎沒有問題有待提及。有什麼建議麼?

  • 類型參數的種類(Iterable [Any] with(A with Int)=> Any)不符合類GenericCompanion中類型參數(類型CC)的預期種類。任何的類型參數都不匹配類型CC的預期參數:沒有類型參數,但類型CC有一個
  • 對象創建不可能,因爲 方法迭代器在特徵IterableLike 的類型=>迭代[java.io.File的]是 未定義
  • 對象創建不可能的,因爲在性狀 方法迭代IterableLike類型的 =>迭代[V]是沒有定義在性狀 IterableLike
  • 覆蓋方法元素類型=> Iterator [java.io.File];方法 元素需要「覆蓋」修飾符
  • 重寫特性中的方法元素 類型=> Iterator [V]的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 
     } 
    } 
    } 
} 
+0

與導入提供的文件和與'iterator'爲'elements'全局替換,你代碼編譯。 – 2010-08-09 23:48:51

回答

7

前者elements現在iterator

您應該使用-Xmigration進行編譯,以獲取有關如何將代碼從2.7移植到2.8的有用提示。

+0

謝謝,就是這樣。我會嘗試-Xmigration – 2010-08-10 00:57:36

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]