Scala Language
式の場合
サーチ…
構文
- {clauses}体のために
- {節}体を産むために
- 体(句)のために
- 体を産む(節)
パラメーター
パラメータ | 詳細 |
---|---|
にとって | forループ/理解を使用するために必要なキーワード |
節 | forが動作する繰り返しとフィルタリング。 |
産出 | コレクションを作成したり、「収穫」したい場合に使用します。 yield を使用すると、 for 戻り値の型がUnit ではなく、コレクションになります。 |
体 | 各反復で実行されるfor式の本体。 |
ベーシック・フォー・ループ
for (x <- 1 to 10)
println("Iteration number " + x)
これは、変数x
を1
から10
まで繰り返し、その値で何かを行うことを示しています。理解のfor
の戻り値の型はUnit
です。
理解のための基礎
これは、for-loopのフィルタとyield
を使用して 'sequence comprehension'を作成する方法を示しています。
for ( x <- 1 to 10 if x % 2 == 0)
yield x
この出力は次のとおりです。
scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10)
理解のためのAは、反復とそのフィルタに基づいて新しいコレクションを作成する必要がある場合に便利です。
ネストされたForループ
これは、複数の変数を反復処理する方法を示しています。
for {
x <- 1 to 2
y <- 'a' to 'd'
} println("(" + x + "," + y + ")")
(なおto
ここに戻り中置オペレータ方法で包括範囲を 。定義を参照してくださいここで 。)
これによって出力が生成されます。
(1,a)
(1,b)
(1,c)
(1,d)
(2,a)
(2,b)
(2,c)
(2,d)
これは、ブラケットの代わりにかっこを使用した同等の表現であることに注意してください。
for (
x <- 1 to 2
y <- 'a' to 'd'
) println("(" + x + "," + y + ")")
すべての組み合わせを単一のベクトルにするyield
、結果をval
設定することができます:
val a = for {
x <- 1 to 2
y <- 'a' to 'd'
} yield "(%s,%s)".format(x, y)
// a: scala.collection.immutable.IndexedSeq[String] = Vector((1,a), (1,b), (1,c), (1,d), (2,a), (2,b), (2,c), (2,d))
理解のためのモナド
モナド型のオブジェクトが複数ある場合は、 'for comprehension'を使って値の組み合わせを得ることができます:
for {
x <- Option(1)
y <- Option("b")
z <- List(3, 4)
} {
// Now we can use the x, y, z variables
println(x, y, z)
x // the last expression is *not* the output of the block in this case!
}
// This prints
// (1, "b", 3)
// (1, "b", 4)
このブロックの戻り値の型はUnit
です。
オブジェクトが同じモナド型M
(例えばOption
)である場合、 yield
を使用するとUnit
代わりにM
型のオブジェクトが返されます。
val a = for {
x <- Option(1)
y <- Option("b")
} yield {
// Now we can use the x, y variables
println(x, y)
// whatever is at the end of the block is the output
(7 * x, y)
}
// This prints:
// (1, "b")
// The val `a` is set:
// a: Option[(Int, String)] = Some((7,b))
yield
キーワードは、モナドタイプ( Option
とList
)が混在している元の例では使用できないことに注意してください。そうしようとすると、コンパイル時の型の不一致エラーが発生します。
Forループを使用してコレクションを反復処理する
これは、マップの各要素を印刷する方法を示します
val map = Map(1 -> "a", 2 -> "b")
for (number <- map) println(number) // prints (1,a), (2,b)
for ((key, value) <- map) println(value) // prints a, b
これは、リストの各要素を出力する方法を示しています
val list = List(1,2,3)
for(number <- list) println(number) // prints 1, 2, 3
理解のために断る
Scala for
理解のfor
ものは構文的な砂糖だけです。これらのwithFilter
は、subject型のwithFilter
、 foreach
、 flatMap
、およびmap
メソッドを使用して実装されます。このため、これらのメソッドが定義されている型だけfor
理解のfor
利用することができます。
A for
、パターンpN
、ジェネレータgN
および条件cN
有する次の形式の理解のfor
である。
for(p0 <- x0 if g0; p1 <- g1 if c1) { ??? }
... withFilter
とforeach
を使用してネストされた呼び出しにデwithFilter
します:
g0.withFilter({ case p0 => c0 case _ => false }).foreach({
case p0 => g1.withFilter({ case p1 => c1 case _ => false }).foreach({
case p1 => ???
})
})
一方、次の形式のfor
/ yield
式があります。
for(p0 <- g0 if c0; p1 <- g1 if c1) yield ???
... withFilter
とflatMap
またはmap
どちらかを使用してネストされた呼び出しにデflatMap
map
:
g0.withFilter({ case p0 => c0 case _ => false }).flatMap({
case p0 => g1.withFilter({ case p1 => c1 case _ => false }).map({
case p1 => ???
})
})
( map
は最も内側の理解で使用され、 flatMap
はすべての外部理解で使用されます)。
理解のfor
理解は、脱糖表現によって要求される方法を実施するあらゆるタイプに適用することができる。これらのメソッドの戻り型は、構成可能である限り、制限はありません。