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
이해는 디 설탕 표현에 필요한 방법을 구현하는 임의의 타입에 적용될 수있다. 이러한 메소드의 반환 유형은 구성 가능한 한 제한이 없습니다.