Positional 타입
Positional 타입 (raku-type-positional)
인덱스로 값을 찾아낼 수 있는 객체들을 위한 역할(role)이에요. 보통 리스트처럼 생긴 객체들이 이 역할을 구현해요. List, Array, Range, Buf 같은 타입이 대표적이죠.
정의
role Positional[::T = Mu] { ... }
[ ] 후치 연산자로 인덱싱할 수 있는 객체를 위한 역할이에요. @array[0]처럼 대괄호로 접근하는 그 동작이 바로 이 역할이 약속하는 기능이죠.
메서드
method of
method of()
포지셔널 컨테이너 요소의 타입 제약을 돌려줘요. 위 정의에서 T가 바로 그건데, 보다시피 기본값은 Mu예요. 타입 객체로 돌려받아요.
my @a;
say @a.of.^name; # OUTPUT: «Mu»
my Str @b;
say @b.of.raku; # OUTPUT: «Str»
say (my int @).of; # OUTPUT: «(int)»
이 역할을 섞는 클래스가 제공해야 하는 메서드들
이 역할을 구현하는 클래스는 다음 메서드들을 직접 제공해야 해요.
method elems
method elems()
인스턴스화된 객체 안에 있는 요소의 개수를 돌려줘야 해요.
method AT-POS
method AT-POS(\position)
주어진 위치의 값(혹은 컨테이너)을 돌려줘야 해요. @a[$i]를 평가할 때 불리는 메서드예요.
method EXISTS-POS
method EXISTS-POS(\position)
주어진 위치에 실제로 값이 있는지 나타내는 Bool을 돌려줘야 해요. @a[$i]:exists 같은 검사가 써요.
method STORE
method STORE(\values, :$INITIALIZE)
이 메서드는 아래 문법을 지원하고 싶을 때만 제공하면 돼요.
my @a is Foo = 1,2,3;
즉 is Foo로 역할 구현을 바인딩한 배열에 값을 넣는 그 문법이죠. 객체를 (재)초기화할 값들을 받아야 해요. 선택적 이름 인자 :$INITIALIZE는 메서드가 처음 호출될 때 True를 담아요. 그리고 invocant를 돌려줘야 해요.
참고: 포지셔널 서브스크립팅을 위해 구현할 수 있는 추가 메서드들에 대해서는 Methods to implement for positional subscripting 문서를 보세요.