5

私はこのスレッドを見ました:

Scala2.8とScala2.7の最大の違いは何ですか?

いくつかの変更をカバーしているようですが、私が最初に遭遇したコンパイルの問題は言及されていないようです。助言がありますか?

  • 型引数の種類(Iterable [Any] with(A with Int)=> Any)は、クラスGenericCompanionで期待される種類の型パラメーター(型CC)に準拠していません。Iterable [Any] with(A with Int)=> Anyの型パラメーターが型CCの期待されるパラメーターと一致しません:型パラメーターはありませんが、型CCには1つあります
  • タイプ=>Iterator[java.io.File]のトレイトIterableLikeのメソッドイテレータが定義されていないため、オブジェクトの作成は不可能です。
  • タイプ=>Iterator[V]のトレイトIterableLikeのメソッドイテレータが定義されていないため、オブジェクトの作成は不可能です。
  • タイプ=>Iterator[java.io.File]のトレイトIterableLikeのメソッド要素をオーバーライドします。メソッド要素には「オーバーライド」修飾子が必要です
  • タイプ=>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
      }
    }
  }
}
4

2 に答える 2

7

前者elementsは現在iteratorです。

コードを2.7から2.8に移植する方法に関する役立つヒントについては、-Xmigrationを使用してコンパイルする必要があります。

于 2010-08-09T23:46:13.633 に答える
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)

イテレータの代わりにストリームを使用することも検討します。イテレータアプローチは、イテレータメソッドを呼び出すときにファイルのセット全体を構築します。ストリームは怠惰になる可能性があります。

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]
于 2010-08-10T02:03:42.770 に答える