6.7 맵 컴프리헨션(Map Comprehension)
6.7 맵 컴프리헨션(Map Comprehension)
Haxe의 맵 컴프리헨션은 배열 컴프리헨션과 유사하지만, 맵 선언(map declaration)처럼 => 연산자를 추가로 사용해요:
class Main {
static public function main() {
var a = [for (i in 0...5) i => 'number ${i}'];
trace(a); // {0 => number 0, 1 => number 1, 2 => number 2, 3 => number 3, 4 => number 4}
var i = 0;
var b = [while (i < 5) i => 'number ${i++}'];
trace(b); // {0 => number 0, 1 => number 1, 2 => number 2, 3 => number 3, 4 => number 4}
}
}
변수 a는 키가 0부터 4까지인 Map과 문자열 값으로 초기화됩니다. 컴파일러는 각 루프 반복의 값을 맵에 더하는 코드를 생성하므로, 다음 코드와 동등합니다:
var a = new Map();
for (i in 0...5) a.set(i, 'number ${i}');
변수 b는 같은 키와 값을 담지만 for 대신 while을 사용하는 다른 컴프리헨션 스타일을 통해 초기화됩니다. 역시 다음 코드와 동등합니다:
var i = 0;
var b = new Map();
while(i < 5) b.set(i, 'number ${i++}');
루프 표현식은 조건과 중첩 루프를 포함한 어떤 것이든 될 수 있어, 다음은 기대대로 동작합니다:
class Main {
static public function main() {
var a = [
for (x in 0...5)
for (y in 0...5)
if (x != y)
x => y
];
// {0 => 4, 1 => 4, 2 => 4, 3 => 4, 4 => 3}
trace(a);
}
}
본문
for/while 컴프리헨션
[for (i in 0...5) i => 'number ${i}']는 각 반복에서 =>로 키-값 쌍을 만들어 맵을 초기화합니다. while 또한 가능하고, 컴파일러가 set() 호출을 생성합니다.
조건 및 중첩
if 조건과 중첩 루프를 포함할 수 있어, 키-값 쌍을 필터링한 맵 컴프리헨션이 가능합니다.