CALL-ME

CALL-ME (객체를 함수처럼 호출)

객체를 괄호를 붙여 함수처럼 호출하고 싶을 때가 있어요. $obj(...)처럼 말이죠. Raku에서는 일반 메서드로는 그게 안 되고, CALL-ME라는 특별한 메서드가 그 역할을 맡아요.

출처: Raku Documentation — CALL-ME

본문

role Callable에서

method CALL-ME(Callable:D $self: |arguments)

이 메서드는 ( ) 후치 연산자와 .( ) 후치 연산자에 필요한 메서드예요. 객체를 실제로 호출 가능하게 만드는 역할을 하며, 특정 객체가 루틴처럼 동작하게 하려면 이 메서드를 오버로드해야 해요. 객체를 & 시길 컨테이너에 저장하려면 Callable을 구현해야 해요.

class A does Callable {
    submethod CALL-ME(|c){ 'called' }
}
my &a = A;
say a(); # OUTPUT: «called␤»

객체를 호출 가능하게 만드는 데 Callable 롤을 적용하는 것이 필수는 아니에요. 클래스가 일반 스칼라 컨테이너에서 서브루틴 같은 의미를 더하고 싶을 뿐이라면, CALL-ME 서브메서드만 써도 돼요.

class A {
    has @.values;
    submethod CALL-ME(Int $x where 0 <= * < @!values.elems) {
        @!values[$x]
    }
}
my $a = A.new: values => [4,5,6,7];
say $a(2); # OUTPUT: «6␤»

role Enumeration에서

multi method CALL-ME(|)

열거값을 주면 Enumeration 인스턴스를 돌려줘요.

enum Mass ( mg => 1/1000, g => 1/1, kg => 1000/1 );
say Mass(1/1000); # OUTPUT: mg