NumStr — 숫자이면서 문자열인 이중 값 타입
NumStr — 숫자이면서 문자열인 이중 값 타입 (Dual value type: both Num and Str)
Raku에는 숫자 리터럴이 숫자인 동시에 문자열로도 쓰일 수 있는 타입들이 있어요. NumStr도 그런 이중 값 타입 중 하나로, 숫자의 성격과 문자열의 성격을 동시에 지니고 있어요. 이런 타입이 왜 필요한지, 어떤 메서드를 제공하는지 살펴볼게요.
본문
NumStr은 Allomorph와 Num을 모두 상속받아요. Allomorph는 다시 Str을 상속하므로, 결과적으로 Num이면서 Str인 타입이 되는 거예요.
class NumStr is Allomorph is Num { }
Allomorph에 대한 자세한 설명은 별도 문서에 있으니, 이 타입의 전체 그림이 궁금하다면 그쪽을 함께 보면 좋아요. 여기서는 직접 예시로 NumStr이 어떻게 동작하는지 확인해볼게요.
my $num-str = <42.1e0>;
say $num-str.^name; # OUTPUT: «NumStr»
my Num $num = $num-str; # OK!
my Str $str = $num-str; # OK!
# ∈ operator cares about object identity
say 42e10 ∈ <42e10 55 1>; # OUTPUT: «False»
<42.1e0>은 숫자처럼 생긴 단어(NumStr 리터럴)예요. 이 값은 Num 타입 변수에도, Str 타입 변수에도 그대로 들어갈 수 있어요. 다만 ∈ 연산자는 객체의 정체성(identity)을 따지기 때문에, 값이 같아 보여도 제대로 매칭되지 않는 경우가 있어요.
메서드
메서드 new
method new(Num $i, Str $s)
생성자는 Num 값과 Str 값을 모두 요구해요. 직접 만들 때는 두 값을 필요한 대로 지정할 수 있어요.
my $f = NumStr.new(42.1e0, "forty two and a bit");
say +$f; # OUTPUT: «42.1»
say ~$f; # OUTPUT: «"forty two and a bit"»
+$f는 숫자로, ~$f는 문자열로 보여줘요. 두 얼굴을 가진 값이 하나의 객체에 담겨 있는 모습이에요.
메서드 Num
method Num
NumStr의 Num 값을 돌려줘요.
메서드 Numeric
multi method Numeric(NumStr:D: --> Num:D)
multi method Numeric(NumStr:U: --> Num:D)
:D 변형은 호출자(invocant)의 숫자 부분을 돌려줘요. :U 변형은 초기화되지 않은 값을 숫자 문맥에서 사용했다는 경고를 낸 뒤, 0e0 값을 돌려줘요.
메서드 Real
multi method Real(NumStr:D: --> Num:D)
multi method Real(NumStr:U: --> Num:D)
Numeric과 동일한 규칙이에요. :D는 숫자 부분을, :U는 경고 후 0e0을 돌려줘요.
연산자
infix ===
multi infix:<===>(NumStr:D $a, NumStr:D $b)
NumStr 값의 정체성 연산자예요. $a와 $b의 Num 값이 서로 ===로 같고, Str 값도 서로 ===로 같으면 True, 그 외에는 False를 돌려줘요.