2.7.4 배열 접근(Array Access)

2.7.4 배열 접근(Array Access)

배열 접근은 전통적으로 배열에서 특정 오프셋의 값을 접근하는 데 쓰는 특수 문법을 말해요. 보통 Int 타입의 인자에서만 허용됩니다. 하지만 추상(abstract)을 사용하면 커스텀 배열 접근 메서드를 정의할 수 있어요. Haxe 표준 라이브러리는 이것을 Map 타입에서 사용하는데, 다음 두 메서드를 찾아볼 수 있습니다:

@:arrayAccess
public inline function get(key:K) {
  return this.get(key);
}
@:arrayAccess
public inline function arrayWrite(k:K, v:V):V {
    this.set(k, v);
    return v;
}

배열 접근 메서드에는 두 종류가 있어요:

  • @:arrayAccess 메서드가 인자를 하나 받으면 getter입니다.
  • @:arrayAccess 메서드가 인자를 두 개 받으면 setter입니다.

위에서 본 getarrayWrite 메서드는 다음처럼 사용할 수 있게 해줍니다:

class Main {
  public static function main() {
    var map = new Map();
    map["foo"] = 1;
    trace(map["foo"]);
  }
}

이 시점에서 배열 접근 필드에 대한 호출이 출력에 삽입되는 것이 놀랍지 않아요:

map.set("foo",1);
console.log(map.get("foo")); // 1
배열 접근 해석 순서(Order of array access resolving)

Haxe 3.2 이전 버전의 버그 때문에, 검사되는 @:arrayAccess 필드의 순서가 정의되어 있지 않았어요. Haxe 3.2에서 필드가 이제 일관되게 위에서 아래로 검사되도록 고쳐졌습니다:

abstract AString(String) {
  public function new(s)
    this = s;

  @:arrayAccess function getInt1(k:Int) {
    return this.charAt(k);
  }

  @:arrayAccess function getInt2(k:Int) {
    return this.charAt(k).toUpperCase();
  }
}

class Main {
  static function main() {
    var a = new AString("foo");
    trace(a[0]); // f
  }
}

배열 접근 a[0]getInt1 필드로 해석되어 소문자 f가 반환됩니다. Haxe 3.2 이전 버전에서는 결과가 다를 수 있어요.

먼저 정의된 필드는 암시적 캐스팅(implicit cast)을 요구하더라도 우선권을 가집니다.

출처: Array Access

본문

커스텀 배열 접근

@:arrayAccess 메타데이터로 추상 타입에 배열 접근 메서드를 정의할 수 있어요. 인자 하나면 getter, 인자 두 개면 setter입니다. Haxe 표준 라이브러리의 Map이 이 기능을 사용해 map["foo"] 같은 배열 접근 문법으로 키-값을 다룹니다.

해석 순서

Haxe 3.2부터 @:arrayAccess 필드는 위에서 아래로 일관되게 검사됩니다. 여러 후보가 있을 때 먼저 정의된 필드가 우선하고, 그것이 암시적 캐스팅을 요구해도 마찬가지입니다.

더 알아보기