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);
  }
}

출처: Map Comprehension

본문

for/while 컴프리헨션

[for (i in 0...5) i => 'number ${i}']는 각 반복에서 =>로 키-값 쌍을 만들어 맵을 초기화합니다. while 또한 가능하고, 컴파일러가 set() 호출을 생성합니다.

조건 및 중첩

if 조건과 중첩 루프를 포함할 수 있어, 키-값 쌍을 필터링한 맵 컴프리헨션이 가능합니다.

더 알아보기