Raku의 AT-POS — 위치 첨자(`[]`)가 읽는 값

Raku의 AT-POS — 위치 첨자([])가 읽는 값

@array[2]처럼 배열에 대괄호 첨자를 쓰면, Raku는 내부적으로 AT-POS 메서드를 호출해요. 여러 타입이 저마다의 방식으로 이 메서드를 구현하고 있으니, 타입별로 하나씩 살펴볼게요.

Range

multi method AT-POS(Range:D: int \pos)
multi method AT-POS(Range:D: int:D \pos)

주어진 Int 위치가 존재하는지 확인하고, 존재하면 그 위치의 요소를 돌려줘요.

say (1..4).AT-POS(2)  # OUTPUT: «3␤»

IterationBuffer

multi method AT-POS(IterationBuffer:D: int $pos)
multi method AT-POS(IterationBuffer:D: Int:D $pos)

주어진 요소 위치의 값을 돌려줘요. 위치가 IterationBuffer 길이를 넘어서면 Mu를 돌려주고, 음수 위치 값이면 인덱스가 범위를 벗어났다는 오류를 던져요.

Subscripts — mutable한 요소를 만들 때

multi method AT-POS(::?CLASS:D: $index)

$index 위치의 요소를 돌려주는 게 기대 동작이에요. postcircumfix [ ]이 보통 이 메서드를 호출해요.

요소를 변경 가능하게 만들고 싶다면(내장 Array 타입처럼), 읽을 땐 요소 값으로 평가되고 대입할 땐 값을 갱신하는 아이템 컨테이너 형태로 돌려줘야 해요. return-rw 또는 is rw 루틴 트레잇을 쓰면 됩니다.

Sequence 역할

multi method AT-POS(::?CLASS:D: Int:D $idx)
multi method AT-POS(::?CLASS:D: int $idx)

캐시된 시퀀스에서 $idx 위치의 요소를 돌려줘요.

Positional 역할 — 기본 정의

method AT-POS(\position)

주어진 위치에 있는 값/컨테이너를 돌려줘야 해요.

출처: Raku 공식 문서 — AT-POS

본문

  • @array[2]의 대괄호 첨자가 호출하는 메서드로, 위치에 해당하는 값을 돌려줘요.
  • Range, IterationBuffer, Sequence 타입과 Subscripts/Positional 역할이 각자 구현을 제공해요.
  • 변경 가능한 요소를 원하면 return-rwis rw로 아이템 컨테이너를 돌려주고, 읽기 전용이면 값을 직접 돌려줘요.