Ada - 可空类型

Ada - Nullable type

如何将自定义类型初始化为 null?

我想这样做:

TestVar : T_MyType := null;

与:

type T_MyType is
record
    field1 : float
    field2 : Boolean
end record

但是我有一个错误:

expected type "T_MyType" defined at myfile.ads

默认情况下,Ada 类型是值类型。

即TestVar是对象本身,其内容为field1、field2。你可以想象它在你定义它的源代码中的地方。它与拥有像 Float 这样更简单类型的变量没有什么不同。

在 C# 或类似语言中,有些类型是 "value types",但有些类型是 "reference types"。在后一种情况下,TestVar 实际上不是对象本身,而是指向真实对象的指针。

在您的 Ada 代码中,要给 TestVar 的值是,例如,(1.23, True)

如果你真的需要指针(注意,你需要的比你想象的要少得多,如果你来自 C、C++、C#...),你可以定义一个访问类型。

Ada 中唯一可以 null 的是 access,它是指针的名称。

在您的情况下,您需要定义在尝试将 null 分配给您的值时您期望的结果。有时,我们会定义一种未初始化的值,例如:

    null_value : constant T_MyType := T_MyType'(field1 => -1.0, field2 => False);

但是如果你真的想像C/C++那样处理一个指针,你需要声明关联的访问类型 :

    type T_MyType_Access is access T_MyType;

有了这个,您将能够声明指向 T_MyType 对象的指针。

只有一件事,与 C/C++ 相比,在 Ada 中,您通常可以在不使用 访问类型 (也称为指针)的情况下构建整个应用程序。

您可以使用变体记录模拟可空类型:

    type T_MyType(Is_Null : Boolean := True) is 
       record
          case Is_Null is
             when False => 
                field1 : Float
                field2 : Boolean
             when True =>
                null; -- no parameters
          end case;
       end record

       -- Example "Null" value.  Trying to use field1 or field2 will
       -- result in an exception as they are not available when Is_Null
       -- is set to True
       Null_MyType : constant T_MyType := (Is_Null => True);

该类型默认没有参数(Is_Null默认为True)。对于大型类型,您可能必须小心返回其中之一,因为它可能很昂贵(您需要查看您的编译器供应商以了解它是否对此进行了优化)。