6.4.9 추출기(Extractors)

6.4.9 추출기(Extractors)

Haxe 3.1.0 이후

추출기는 매칭되는 값에 변환을 적용할 수 있게 해줍니다. 매칭된 값에 작은 연산이 필요할 때(매칭을 계속하기 전에) 유용해요:

enum Test {
  TString(s:String);
  TInt(i:Int);
}

class Main {
  static public function main() {
    var e = TString("fOo");
    switch (e) {
      case TString(temp):
        switch (temp.toLowerCase()) {
          case "foo": true;
          case _: false;
        }
      case _:
        false;
    }
  }
}

여기서 TString enum 생성자의 인자 값을 변수 temp로 캡처한 뒤, temp.toLowerCase()에 대해 중첩 switch를 사용합니다. 분명히 대소문자와 무관하게 TString"foo" 값을 가지면 매칭이 성공하기를 원해요. 이것은 추출기로 단순화할 수 있습니다:

enum Test {
  TString(s:String);
  TInt(i:Int);
}

class Main {
  static public function main() {
    var e = TString("fOo");
    var success = switch(e) {
      case TString(_.toLowerCase() => "foo"):
        true;
      case _:
        false;
    }
  }
}

추출기는 extractorExpression => match 구문으로 식별됩니다. 컴파일러는 이전 예제와 유사한 코드를 생성하지만, 원래 구문은 크게 단순화되었어요. 추출기는 => 연산자로 분리된 두 부분으로 구성됩니다:

  • 왼쪽은 어떤 표현식이든 될 수 있으며, 밑줄 _의 모든 등장이 현재 매칭되는 값으로 대체됩니다.
  • 오른쪽은 왼쪽의 평가 결과에 대해 매칭되는 패턴입니다.

오른쪽이 패턴이므로 다른 추출기를 포함할 수 있어요. 다음 예제는 두 추출기를 "연결(chains)합니다":

class Main {
  static public function main() {
    switch (3) {
      case add(_, 1) => mul(_, 3) => a:
        trace(a);
    }
  }

  static function add(i1:Int, i2:Int) {
    return i1 + i2;
  }

  static function mul(i1:Int, i2:Int) {
    return i1 * i2;
  }
}

이것은 add(3, 1)(여기서 3은 매칭된 값)과 mul(4, 3)(여기서 4add 호출의 결과)의 호출 결과로 12를 출력합니다. 두 번째 => 연산자 오른쪽의 a캡처 변수(capture variable)라는 점을 주목할 가치가 있어요.

현재 or 패턴(or-patterns) 안에서 추출기를 사용하는 것은 불가능합니다:

class Main {
  static public function main() {
    switch ("foo") {
      // Extractors in or patterns are not allowed
      case(_.toLowerCase() => "foo") | "bar":
    }
  }
}

하지만 추출기의 오른쪽에는 or 패턴을 둘 수 있으므로, 이전 예제는 괄호 없이 컴파일됩니다.

출처: Extractors

본문

추출기의 기본

추출기는 왼쪽표현식 => 패턴 형태로, 왼쪽의 _를 현재 매칭 값으로 대체해 변환을 적용합니다. 예: _.toLowerCase() => "foo"는 값을 소문자로 바꿔 "foo"와 매칭해요.

추출기 연결

오른쪽이 패턴이므로 다른 추출기를 포함할 수 있어요. add(_, 1) => mul(_, 3) => a처럼 여러 추출기를 연결하고 최종 값을 변수로 캡처할 수 있습니다.

제약

추출기를 or 패턴 안에 직접 넣을 수는 없지만, 추출기 오른쪽에는 or 패턴을 둘 수 있어요.

더 알아보기