IntStr 타입
IntStr 타입 (raku-type-intstr)
정수와 문자열, 두 값을 동시에 담는 이중 값 타입이에요. Allomorph(그리고 그 상위인 Str)과 Int를 둘 다 상속받아서, 숫자로도 문자열로도 쓰일 수 있어요.
정의
class IntStr is Allomorph is Int { }
IntStr은 Allomorph의 하위 클래스뿐 아니라 Int의 하위 클래스이기도 해요. .Int 문맥에서는 정수로, .Str 문맥에서는 문자열로 행동하는 거죠. 이런 타입은 < > 따옴표 없는 단어 리스트에서 숫자처럼 보이는 토큰을 만들 때 나와요.
my $int-str = <42>;
say $int-str.^name; # OUTPUT: «IntStr»
my Int $int = $int-str; # OK!
my Str $str = $int-str; # OK!
# ∈ operator cares about object identity
say 42 ∈ <42 55 1>; # OUTPUT: «False»
42는 Int이고 <42>는 IntStr이라서, 같은 값처럼 보여도 ∈(원소 검사)는 객체 정체성까지 따지니 False가 나와요.
참고:
Allomorph에 대한 더 자세한 내용은Allomorph문서에서 다뤄요.
메서드
method new
method new(Int $i, Str $s)
생성자는 Int 값과 Str 값을 둘 다 요구해요. 직접 만들 때는 원하는 값들을 넣으면 돼요.
my $f = IntStr.new(42, "forty two");
say +$f; # OUTPUT: «42»
say ~$f; # OUTPUT: «"forty two"»
method Int
method Int
IntStr의 정수 값을 돌려줘요.
method Numeric
multi method Numeric(IntStr:D: --> Int:D)
multi method Numeric(IntStr:U: --> Int:D)
:D(정의된 값) 변형은 invocant의 숫자 부분을 돌려줘요. :U(정의되지 않은 값) 변형은 숫자 문맥에서 초기화되지 않은 값을 썼다는 경고를 낸 뒤 0을 돌려줘요.
method Real
multi method Real(IntStr:D: --> Int:D)
multi method Real(IntStr:U: --> Int:D)
Numeric과 마찬가지로, :D 변형은 숫자 부분을 돌려주고 :U 변형은 경고 후 0을 돌려줘요.
연산자
infix ===
multi infix:<===>(IntStr:D $a, IntStr:D $b)
IntStr 값 정체성 연산자예요. $a와 $b의 Int 값이 서로 같고 Str 값도 서로 같을 때만 True를 돌려줘요. 그 외에는 False예요.