【问题标题】:What are discriminated records in Ada?什么是 Ada 中的歧视记录?
【发布时间】:2018-06-11 23:50:42
【问题描述】:

我试图了解 Ada 中有哪些歧视性记录,但无法在网上找到明确、准确的答案。

例如是什么使它成为有区别的记录:

type Discriminated_Record (Size : Natural) is 
    record
       A : String (1 .. Size);
    end record;

【问题讨论】:

  • 您可以在 Ada 中看到一条区分记录作为 C/C++ 中的 union。它只是意味着通过给定的参数,您从该记录中选择字段(在 C 中,您将执行类似 stVar.astVar.b 的操作,其中 stVar 是具有 ab 的联合结构是其可能具有不同类型或布局的字段)。

标签: record ada


【解决方案1】:

这是一个可区分的type,因为它有一个判别式,它是一个可区分的record,因为它是一个记录。其他可以有判别式的类型是任务类型和受保护类型。

对于一个被区分的对象,判别式只是另一个组件(除了不可变之外)。所以给定

type Buffer(Size : Buffer_Size := 100)  is
   record
      Pos   : Buffer_Size := 0;
      Value : String(1 .. Size);
   end record;

B : Buffer (Size => 50);

您可以访问B.Size(与B.Value’Length 相同)。

【讨论】:

  • 技术上B.Value'LastB.Value'Length 的类型是通用整数,不是Buffer_Size
  • 请注意,不能用具有不同判别式的值重新分配 B。判别式是类型的一部分,因此仅在判别式上不同的两种类型是不相容的。我相信这也意味着wiki entry regarding optionals in Ada 不正确;建议的 Optional_Type 没用,因为你只能用它来表示一个常量可选。
  • @TamaMcGlinn - 常量对象很有用:您可以让函数返回此可选类型的值。
【解决方案2】:

判别式Size 使Discriminated_Record 成为判别记录。

【讨论】:

  • 所以大小是discriminant,区分记录是参数化记录。对吗?
  • 是的,通常用于在运行时边界可能会发生变化的数组。
  • @zython,是的,请参阅ARM 3.7(1)
  • @oenone,ARM 3.7(1) 明确指出,数组不是复合的,不能有判别式。约束,是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多