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