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)。对于大型类型,您可能必须小心返回其中之一,因为它可能很昂贵(您需要查看您的编译器供应商以了解它是否对此进行了优化)。
如何将自定义类型初始化为 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)。对于大型类型,您可能必须小心返回其中之一,因为它可能很昂贵(您需要查看您的编译器供应商以了解它是否对此进行了优化)。