サーチ…


構文

  • {clauses}体のために
  • {節}体を産むために
  • 体(句)のために
  • 体を産む(節)

パラメーター

パラメータ詳細
にとって forループ/理解を使用するために必要なキーワード
forが動作する繰り返しとフィルタリング。
産出コレクションを作成したり、「収穫」したい場合に使用します。 yieldを使用すると、 for戻り値の型がUnitではなく、コレクションになります。
各反復で実行されるfor式の本体。

ベーシック・フォー・ループ

for (x <- 1 to 10)
  println("Iteration number " + x)

これは、変数x1から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キーワードは、モナドタイプ( OptionList )が混在している元の例では使用できないことに注意してください。そうしようとすると、コンパイル時の型の不一致エラーが発生します。

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型のwithFilterforeachflatMap 、およびmapメソッドを使用して実装されます。このため、これらのメソッドが定義されている型だけfor理解のfor利用することができます。

A for 、パターンpN 、ジェネレータgNおよび条件cN有する次の形式の理解のforである。

for(p0 <- x0 if g0; p1 <- g1 if c1) { ??? }

... withFilterforeachを使用してネストされた呼び出しにデ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 ???

... withFilterflatMapまたは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理解は、脱糖表現によって要求される方法を実施するあらゆるタイプに適用することができる。これらのメソッドの戻り型は、構成可能である限り、制限はありません。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow