comparable 타입은 이 타입의 값을 다른 값과 비교하는 데 사용됩니다.
= 및 <> 연산자는 이 타입을 이용하여 시그니처를 정의합니다.
operator'='(:t, :comparable where t:subtype(comparable)):t
operator'<>'(:t, :comparable where t:subtype(comparable)):t
이러한 각 함수는 comparable 의 임의의 서브타입인 첫 번째 실행인자를 가져오고, 임의의 서브타입이면서 첫 번째 실행인자와 동일한 타입을 반환하는 두 번째 실행인자를 가져오는 것으로 정의됩니다.
comparable 타입에는 사용 가능한 하위 타입이 많이 있습니다. 이러한 하위 타입은 같은 타입의 다른 값과 비교될 수 있으며, comparable 의 다른 하위 타입과도 비교할 수 있습니다. 이러한 하위 타입은 다음을 포함합니다.
intlogicfloatcharchar32- 포함된 모든 타입이
comparable의 하위 타입인 배열 - 포함된 모든 타입이
comparable의 하위 타입인 옵션 - 포함된 모든 타입이
comparable의 하위 타입인 튜플 - 포함된 모든 타입이
comparable의 하위 타입인 맵
클래스 또한 unique 지정자를 통해 comparable 의 하위 타입이 될 수 있습니다. 이 지정자가 있는 클래스의 인스턴스는 포함된 멤버가 동일하더라도, 자기 자신만이 동일한 인스턴스가 될 수 있습니다. 예를 들면 다음과 같습니다.
int_ref := class<unique>:
Contents:int
Main()<decides> : void =
X := int_ref{Contents := 0}
Y := int_ref{Contents := 0}
X = X # Succeeds
X = Y # Fails
X <> Y # Succeeds
현재 unique 여부에 관계없이 float , option , classes 는 맵의 키로 사용할 수 없습니다. 즉, 맵 키는 이름이 주어지지 않은 comparable 의 서브타입이어야 합니다. 따라서 Verse 코드에서 필수 서브타입 지정을 설명할 수 없어 맵 키 타입은 파라미터 타입이 될 수 없습니다.
comparable 의 서브타입 값은 comparable 의 다른 모든 서브타입 값과 비교될 수 있으므로 예상치 못한 결과가 발생할 수 있습니다. 예를 들면 다음과 같습니다.
0 = 0.0
이 예시에서는 실패가 발생하는데, 0 은 int 타입이지만 0.0 은 float 타입이며 int 와 float 는 서브타입 관계를 공유하지 않기 때문입니다.