comparable
タイプを使用するのは、この型の 値 と同じ型の他の値を比較するためです。
=
と <>
演算子 をこの型で利用して、シグネチャ を定義します。
operator'='(:t, :comparable where t:subtype(comparable)):t
operator'<>'(:t, :comparable where t:subtype(comparable)):t
これらの 関数 それぞれで定義されているのは、第 1 引数 に comparable
の任意のサブタイプ、第 2 引数も任意のサブタイプをとり、第 1 引数と同じ型を返すことです。
comparable
型には利用できる多くのサブタイプがあります。これらのサブタイプ両方とも同じ型の他の値と comparable
の他のサブタイプを比較できます。次のサブタイプがあります。
int
logic
float
char
char32
- 配列 (含まれるすべての型が
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 # 成功
X = Y # 失敗
X <> Y # 成功
現在、float
、option
および クラス (unique の指定に関係なく) はマップのキーとして使用できません。マップ キーは、指定名がない comparable
のサブタイプにする必要があります (したがって、必須のサブタイプ化は Verse コードで記述できないため、マップ キー型はパラメトリック型になりません)。
注意が必要なのは、comparable
のサブタイプの値が、comparable
の異なるサブタイプにある他の値と比較できるため、場合により期待しない結果が起きることです。 次に例を示します。
0 = 0.0
この例は 失敗 します。0
が型 int
で、一方、0.0
は型 float
であり、int
と float
がサブタイプ化関係を共有しないためです。