Callable — 호출 가능한 코드 객체
Callable — 호출 가능한 코드 객체
Raku에서 "이건 함수처럼 호출할 수 있어"라는 걸 표현하는 타입이 필요할 때가 있어요. 그 역할을 하는 게 바로 Callable 롤이에요. 코드를 값으로 저장하고 나중에 (...)로 호출하고 싶을 때 이 타입이 기준이 됩니다.
본문
role Callable { ... }
Callable은 호출(calling)을 지원하는 객체를 위한 롤이에요. Block, Routine, Sub, Method, Submethod, Macro 타입에서 쓰입니다.
Callable은 & 시길(sigil) 컨테이너에 저장할 수 있는데, 그런 컨테이너의 기본 타입 제약이 바로 Callable이에요.
my &a = {;}; # 빈 블록은 세미콜론이 필요해요
my &b = -> {};
my &c = sub () {};
sub foo() {};
my &d = &foo;
메서드
method CALL-ME
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 롤을 적용하는 게 필수는 아니에요. 그냥 일반 스칼라 컨테이너에서 서브루틴 같은 의미를 더하고 싶다면, submethod 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»
method Capture
method Capture()
X::Cannot::Capture 예외를 던져요.