6.4.3 변수 캡처(Variable capture)

6.4.3 변수 캡처(Variable capture)

하위 패턴의 어떤 값이든 식별자에 매칭해 잡을 수 있어요:

var myTree = Node(Leaf("foo"), Node(Leaf("bar"), Leaf("foobar")));
var name = switch (myTree) {
    case Leaf(s): s;
    case Node(Leaf(s), _): s;
    case _: "none";
  }
trace(name); // foo

이것은 다음 중 하나를 반환합니다:

  • myTreeLeaf이면 그 이름이 반환된다.
  • myTree가 왼쪽 하위 트리가 LeafNode이면 그 이름이 반환된다(여기서 해당돼 "foo" 반환).
  • 그 외에는 "none"이 반환된다.

=를 사용해 더 매칭되는 값을 캡처할 수도 있어요:

var myTree = Node(Leaf("foo"), Node(Leaf("bar"), Leaf("foobar")));
var node = switch (myTree) {
    case Node(leafNode = Leaf("foo"), _): leafNode;
    case x: x;
  }
trace(node); // Leaf(foo)

여기서 입력이 Leaf("foo")와 일치하면 leafNodeLeaf("foo")에 바인딩됩니다. 다른 모든 경우 myTree 자체가 반환돼요: case x는 무엇이든 일치한다는 점에서 case _와 유사하지만, x 같은 식별자 이름은 일치 값을 그 변수에 바인딩하기도 합니다.

Haxe 4.0.0 이후 — 컴파일러가 "catch-all" 변수의 이름이 enum 생성자와 매우 유사하다고 감지하면 잠재적 오타를 경고합니다. 변수 식별자 앞에 var를 붙이면 이를 피할 수 있어요:

var myTree = Node(Leaf("foo"), Node(Leaf("bar"), Leaf("foobar")));
switch (myTree) {
  case Leaf(_):
  // ...
  case var node:
    // without var above the compiler would warn about a potential typo
    // node contains the entire matched tree
}

어떤 캡처 변수든, 심지어 하위 패턴 안에서도 var로 접두할 수 있어요.

출처: Variable capture

본문

식별자 캡처

case Leaf(s):처럼 하위 패턴 값을 식별자에 캡처할 수 있어요. case x:는 무엇이든 일치시키고 그 값을 x에 바인딩합니다.

= 로 캡처

leafNode = Leaf("foo")처럼 =를 쓰면 더 깊이 매칭하면서 값을 캡처할 수 있어요.

var 접두

Haxe 4에서 catch-all 캡처 이름이 enum 생성자처럼 보이면 오타 경고가 나올 수 있어요. case var node:처럼 var로 접두하면 피할 수 있습니다.

더 알아보기