`are`

are (리스트 원소들의 가장 좁은 공통 타입 찾기)

리스트 안의 원소들이 전부 어느 타입인지, 그리고 특정 타입과 모두 스마트매치 되는지 확인하고 싶을 때가 있어요. are가 그 두 가지를 한 번에 다뤄줘요.

출처: Raku Documentation — method are

본문

Any

multi method are(Any:)
multi method are(Any: Any $type)

인자 없는 버전은 Rakudo 컴파일러 2022.02 릴리스부터 사용할 수 있어요. 타입 인자를 받는 버전은 6.e 언어 버전에 속하고(초기 구현은 Rakudo 컴파일러 2024.05+에 있음), 인자 없이 호출하면 리스트의 모든 원소가 스마트매치할 가장 좁은 타입(또는 롤)을 돌려줘요. 빈 리스트에서는 Nil을 돌려주죠.

say (1,2,3).are;        # OUTPUT: «(Int)␤»
say <a b c>.are;        # OUTPUT: «(Str)␤»
say <42 666>.are;       # OUTPUT: «(IntStr)␤»
say (42,666e0).are;     # OUTPUT: «(Real)␤»
say (42,i).are;         # OUTPUT: «(Numeric)␤»
say ("a",42,3.14).are;  # OUTPUT: «(Cool)␤»
say ().are;             # OUTPUT: «Nil␤»

스칼라 값은 원소 하나짜리 리스트로 해석돼요.

say 42.are;             # OUTPUT: «(Int)␤»
say Int.are;            # OUTPUT: «(Int)␤»

Hash는 Pair들의 리스트로 해석되기 때문에 항상 Pair 타입 객체를 만들어내요. 해시의 키나 값의 가장 좁은 타입을 얻으려면 .keys.values 메서드를 사용하세요.

my %h = a => 42, b => "bar";
say %h.keys.are;        # OUTPUT: «(Str)␤»
say %h.values.are;      # OUTPUT: «(Cool)␤»

타입 인자와 함께 호출하면 인보컨트의 모든 타입이 주어진 타입과 스마트매치하는지 확인해요. 맞다면 True를 돌려주고, 스마트매치가 하나라도 실패하면 Failure를 돌려줘요.

say (1,2,3).are(Int);         # OUTPUT: «True␤»
say <a b c>.are(Str);         # OUTPUT: «True␤»
say <42 666>.are(Int);        # OUTPUT: «True␤»
say <42 666>.are(Str);        # OUTPUT: «True␤»
say (42,666e0).are(Real);     # OUTPUT: «True␤»
say (42,i).are(Numeric);      # OUTPUT: «True␤»
say ("a",42,3.14).are(Cool);  # OUTPUT: «True␤»
say ().are(Int);              # OUTPUT: «True␤»
Int.are(Str);      # OUTPUT: «Expected 'Str' but got 'Int'␤»
(1,2,3).are(Str);  # OUTPUT: «Expected 'Str' but got 'Int' in element 0␤»