リモートファイルシステムへのアクセスを可能にする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
なぜタイプマッチングが機能しないのですか?