2010-08-09 28 views
5

tôi thấy chủ đề này:Porting mới Iterable {} mã từ Scala 2.7.7 đến 2.8

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

Dường như để trang trải một số thay đổi, nhưng là người đầu tiên biên dịch các vấn đề Tôi đã trúng không có vẻ được đề cập. Bất kỳ đề xuất?

  • loại đối số loại (Lặp lại [Bất kỳ] với (A với Int) => Bất kỳ) không tuân thủ các loại tham số loại mong đợi (loại CC) trong lớp GenericCompanion. Iterable [Any] với tham số kiểu A (có Int) => Bất kỳ tham số kiểu nào không khớp với tham số kiểu của CC: không có tham số kiểu, nhưng gõ CC có một
  • tạo đối tượng không thể, vì trình lặp phương thức theo đặc điểm IterableLike loại => iterator [java.io.File] đang không được định nghĩa
  • tạo đối tượng không thể, kể từ phương pháp lặp trong đặc điểm IterableLike của type => iterator [V] không được định nghĩa
  • yếu tố phương pháp trọng trong đặc điểm IterableLike của loại => Iterator [java.io.File]; phương pháp yếu tố cần sửa đổi 'ghi đè'
  • phần tử phương thức ghi đè trong đặc điểm IterableLike of type => Iterator [V]; yếu tố phương pháp cần 'đè' modifier

Dưới đây là mã trong câu hỏi:

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

Được cung cấp với một khẩu đối với File và với một thay toàn cầu của 'iterator' cho' elements', bạn biên dịch mã. –

Trả lời

7

Cựu elements tại là iterator.

Bạn nên biên dịch bằng -Xác định cho các gợi ý hữu ích về cách chuyển mã của bạn từ 2,7 đến 2,8.

+0

Cảm ơn, đó là nó. Tôi sẽ cố gắng thực hiện –

5

Chìa khóa ở đây là đảm bảo bạn sử dụng trình lặp phương thức có Iterable. Scala 2.8.0 cũng đã làm rất nhiều để đảm bảo rằng các loại nhất quán trên các cuộc gọi thu thập.

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

Tôi cũng sẽ xem xét sử dụng Luồng thay vì trình lặp. Cách tiếp cận vòng lặp sẽ xây dựng toàn bộ tập tin khi gọi phương thức vòng lặp. Một luồng có thể là lười biếng.

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

Ngoài ra, nếu bạn muốn bao gồm các thư mục trong dòng, hãy thử như sau:

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] 
Các vấn đề liên quan