`are`
are (리스트 원소들의 가장 좁은 공통 타입 찾기)
리스트 안의 원소들이 전부 어느 타입인지, 그리고 특정 타입과 모두 스마트매치 되는지 확인하고 싶을 때가 있어요. 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»