8

リモートファイルシステムへのアクセスを可能にするAPIに対してコーディングしています。APIは、ファイルとディレクトリのリストをノードオブジェクトのリストとして返します(ファイルとディレクトリの親)。

ファイルを無視して、ディレクトリのみで作業したい。ループで型パターンマッチングを使用しようとしましforたが、機能しません。

for {
    dir: CSDir <- workarea.getChildren() // <-- I'm getting an error here complaining about type conversion
} {
    println(dir)
}

これは、scala基本オブジェクトを使用して依存関係なしで実行する同様の例です。

val listOfBaseObjects:List[Any] = List[Any]("a string", 1:Integer);

for (x: String <- listOfObjects) {
  println(x)
}

forループの側で通常のパターンマッチングを使用することになり、それは正常に機能します。

// This works fien
for (child <- workarea.getChildren()) {
  child match {
    case dir: CSDir => println(dir)
    case _ => println("do not nothing")
  }
}

質問:

最初の/2番目の例がscala1.9で機能しない理由を教えてください。

「ProgramminginScala」では、 forループが機能するように、と同じパターンマッチングを使用するようにアドバタイズされていmatchます。

forとmatchが異なる場合は、詳細が記載された記事をいくつか紹介していただければ幸いです。割り当てのパターンマッチングはどうですか?

アップデート:

「Prog.inscala」と矛盾するため、forループで要素をスキップすることは不可能であるという回答を受け入れることはできません。セクション23.1のフラグメントは次のとおりです。

pat <- expr...パターンpatは、そのリストのすべての要素に対して1つずつ照合されます。...一致が失敗した場合、MatchErrorはスローされません。代わりに、要素は反復から単純に破棄されます

実際、次の例は問題なく機能します。

scala> val list = List( (1,2), 1, 3, (3,4))
scala> for ((x,y) <- list) { println (x +","+ y) }
1,2
3,4

なぜタイプマッチングが機能しないのですか?

4

3 に答える 3

12

これは長年の問題900であり、これまで何度も議論されてきました。一般的な回避策は、次のようなものを使用することです。

for (y@(_y:String) <- listOfBaseObjects) {
    println(y)
}

上記のチケットへのコメントで、JasonZauggによってより良いバージョンが提供されています。

object Typed { def unapply[A](a: A) = Some(a) }

for (Typed(y : String) <- listOfBaseObjects) {
    println(y)
}
于 2012-07-09T13:05:50.463 に答える
1

あなたがしたいことは本質的に:workarea.getChildren()タイプのすべての要素を反復することですCSDir(言い換えれば、いくつかの基準に一致します)。通常のループ/理解のために、すべての要素を繰り返します。あなたは言うことはできません:このタイプを持つすべての要素を繰り返し、他の要素をスキップします。もっと明確にする必要があります。

についてどう思いますか:

workarea.getChildren() collect {case dir: CSDir => dir} foreach println

それはあなたが望むことを正確に行います:のすべての要素を収集し、それらのそれぞれについてを呼び出します。workarea.getChildren()println

于 2012-07-09T11:27:50.977 に答える
-1

これはどう:

val listOfBaseObjects: List[Any] = List[Any]("a string", 1:Integer);

for (x <- listOfBaseObjects if x.isInstanceOf[String]) {
  println(x)
}
于 2015-06-19T18:50:20.433 に答える