Тип comparable
используется для сравнения значений одного типа с другими значениями того же типа.
Он используется с операторами =
и <>
для сравнения сигнатур.
operator'='(:t, :comparable where t:subtype(comparable)):t
operator'<>'(:t, :comparable where t:subtype(comparable)):t
Каждая из этих функций определена как принимающая первый и второй аргументы произвольного подтипа comparable
и возвращающая значение того же типа, что и первый аргумент.
Тип comparable
имеет множество подтипов, которые можно использовать. Эти подтипы можно сравнивать как с другими значениями того же типа, так и с другими подтипами comparable
. К таким подтипам относятся:
int
;logic
;float
char
;char32
;- array, если все содержащиеся типы являются подтипами
comparable
; - option, если все содержащиеся типы являются подтипами
comparable
; - tuple, если все содержащиеся типы являются подтипами
comparable
; - map, если все содержащиеся типы являются подтипами
comparable
.
Классы также можно сделать подтипами comparable
с помощью спецификатора unique
. Экземпляры классов с таким спецификатором эквивалентны только самим себе, даже если эквивалентны содержащиеся в них члены. Пример:
int_ref := class<unique>:
Contents:int
Main()<decides> : void =
X := int_ref{Contents := 0}
Y := int_ref{Contents := 0}
X = X # Выполнение
X = Y # Невыполнение
X <> Y # Выполнение
В настоящее время типы float
, option
, а также классы (независимо от наличия у них спецификатора unique) не могут использоваться в качестве ключей ассоциативных массивов (map). Ключи ассоциативных массивов должны иметь подтип comparable
без присвоенного имени. (По этой причине у ассоциативных массивов не может быть параметрических ключей, так как в коде Verse невозможно описать необходимые подтипы.)
Обратите внимание, что, поскольку значение подтипа comparable
может сравниваться с любым другим значением другого подтипа comparable
, возможны неожиданные результаты. Пример:
0 = 0.0
Этот пример не выдаст результата, потому что 0
имеет тип int
, тогда как 0.0
имеет тип float
, а int
и float
не являются подтипами.