9

完全にAda型システムの学習演習として、私は3つの型(つまり、1つの型と2つのサブ型)を作成しようとしていました。

  • Month_Type、すべての月の列挙
  • Short_Month_TypeMonth_Type30日で月のみを持つサブタイプ
  • February_Month_Type、2月だけのサブタイプ

サブタイプはrangeメカニズムを使用する必要があるようですよね?(他の種類のサブタイプはありますか?)連続した範囲で機能させるには、Month_Type列挙を次の順序で並べる必要がありました。

   type Month_Type is (February, April, June, September, November, January, March, May, July, August, October, December);

明らかに、これは数か月の自然な順序ではなく、人々/私がやろうとしていることMonth_Type'Firstや、1月になることを期待していることを見ることができました。

したがって、このばかげた例からの2つの一般的な質問:

  1. 範囲ではなく、基本タイプの特定のコンポーネントを指定するサブタイプを持つことはできますか?
  2. どういうわけか、月を置いた順序の実装の詳細を非表示にできますか(たとえば、'Firstを非表示にします)?

ありがとう!

4

4 に答える 4

6

列挙内の特定の値のみを指定するオブジェクトを作成できます。一般的にこれを「セット」と呼びます。

多くの言語には、基本タイプとしてセットがあります(配列とレコードとともに)。もちろん、そうでない人もいます。エイダはちょっと真ん中です。公式には「set」などの名前の型はありませんが、ブール演算は、の配列に対するビット単位の論理演算のように機能するように定義されてbooleanいます。配列をパックすると、他の言語の「セット」タイプが提供するものとほぼ同じになります。したがって、 Adaはセットをサポートします。これらは単に「ブール値の配列」と呼ばれます。

type Month_Set is array (Month) of Boolean;
Short_Month : constant Month_Set := 
    (September => true, April => true, June => true, November => true, 
     February => true, others => false);
Y_Month : constant Month_Set :=
    (January => true, February => true, May => True, July => true, 
     others => false);

-- Inclusion
if (Short_Month(X)) then ...

-- Intersection (Short_Y will include only February)
Short_Y := Short_Month and Month_Ending_in_Y;

-- Union (Short_Y will include All Short_Months and all Y_Months
Short_Y := Short_Month or Month_Ending_in_Y;

-- Negation (Short_Y will include all Short_Months not ending in Y
Shorty_Y := Short_Month and not Month_Ending_in_Y;
于 2012-09-01T17:43:49.593 に答える
6

いいえ、列挙 サブタイプはこのコンテキストでrange_constraintのみを許可しますが、 を使用して任意の数のセットを作成できますAda.Containers.Ordered_Setsここここに例があります。

于 2012-09-01T02:41:39.980 に答える
2

トラッシュゴッドは最初の質問に答えました。2 番目の質問に答えるには、型自体を非公開にします。

于 2012-09-01T15:06:38.440 に答える