Scala Language
표현식의 경우
수색…
통사론
- 몸을위한 {절}
- {clauses} 항복 몸
- 몸을위한 (절)
- 몸을 산출하기위한 (절)
매개 변수
| 매개 변수 | 세부 |
|---|---|
| ...에 대한 | for 루프 / 이해를 사용하는 데 필요한 키워드 |
| 조항 | for가 작동하는 반복 및 필터입니다. |
| 수율 | 컬렉션을 만들거나 '산출'하려면이 옵션을 사용하십시오. yield 를 사용하면 for 의 반환 유형이 Unit 아닌 콜렉션이됩니다. |
| 신체 | 각 반복마다 실행되는 for 표현식의 본문입니다. |
기본 For 루프
for (x <- 1 to 10)
println("Iteration number " + x)
이것은 변수 x 를 1 에서 10 까지 반복하고 그 값으로 무엇인가를하는 것을 보여줍니다. 이해를 for 리턴 타입은 Unit 입니다.
기본 이해력
이것은 for-loop에 대한 필터와 'sequence comprehension'을 만들기위한 yield 의 사용법을 보여줍니다.
for ( x <- 1 to 10 if x % 2 == 0)
yield x
이 출력은 다음과 같습니다.
scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10)
A 이해는 반복 및 필터를 기반으로 새 모음을 만들어야 할 때 유용합니다.
Nested For Loop
다음은 여러 변수를 반복하는 방법을 보여줍니다.
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 를 사용 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
이해력을위한 Desugaring
스칼라 for 이해는 단지 통사론적인 설탕 이다. 이러한 withFilter 는 withFilter , foreach , flatMap 및 해당 주제 유형의 map 메소드를 사용하여 구현됩니다. 이러한 이유로 정의 된 이러한 메소드가있는 유형 만이 이해를 for 활용 될 수 있습니다.
A for 패턴 pN , 제너레이터 gN 및 조건 cN 을 갖는 다음 형태의 이해를 for .
for(p0 <- x0 if g0; p1 <- g1 if c1) { ??? }
... withFilter 및 foreach 사용하여 중첩 된 호출에 de-sugar합니다.
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 이해는 디 설탕 표현에 필요한 방법을 구현하는 임의의 타입에 적용될 수있다. 이러한 메소드의 반환 유형은 구성 가능한 한 제한이 없습니다.