宝书 #2: Ada 2005 受限类型
— 集合中的<>标记
by Bob Duff—AdaCore
Translator:Dongfeng.Gu
让我们开始…
上周,我们提到Ada2005允许为受限类型提进行合声明。这样的一个集合必须用于初始化某个对象(其中包括参数传递,我们进行形式参数的初始化)。受限(对象的)集合(声明)是在对象初始化的地方现场创建。
这里是例程:
type Limited_Person is limited
record
Self : Limited_Person_Access := Limited_Person'Unchecked_Access;
Name : Unbounded_String;
Age : Natural;
Shoe_Size : Positive;
end record;
X : aliased Limited_Person :=
(Self => null, – Wrong!
Name => To_Unbounded_String (”John Doe”),
Age => 25,
Shoe_Size => 10);
X.Self := X'Access;
把Self设置为错误的值(null)然后再修正它,这看起来不舒服。同样讨厌的是对于Self我们已经有了一个(正确的)默认值,但在Ada95中,我们不能在集合中使用默认值。Ada2005中在集合中加入了一个新的语法--“<>”意思是“如果有的话请使用默认值”。
这里,我们可以说:
X : aliased Limited_Person :=
(Self => <>,
Name => To_Unbounded_String (”John Doe”),
Age => 25,
Shoe_Size => 10);
这个 “Self => <>”意味着使用Limited_Person'Unchecked_Access默认值。既然Limited_Person出现在类型声明中,它指向该类型的当前实例,在这里是X。因此,我们设置X.Self 为X'Unchecked_Access 。
Note that using “<>” in an aggregate can be dangerous, because it can leave some components uninitialized. “<>” means “use the default value”. If the type of a component is scalar, and there is no record-component default, then there is no default value.
注意,在集合中使用“<>”可能产生危险,因为它可能会遗留一些未初始化成员。“<>”意味着“使用默认值”。如果一个成员的类型是标量类型,并且没有记录元素的默认值,接着(这个成员)将没有默认值。
例如,如果我们有一个String类型的集合,像这样:
Uninitialized_String_Const : constant String := (1..10 => <>);
we end up with a 10-character string all of whose characters are invalid values. Note that this is no more nor less dangerous than this:
我们用10个都是非法值的字符串来结尾。注意,这并不比这更危险:
Uninitialized_String_Var : String (1..10); – no initialization
Uninitialized_String_Const : constant String := Uninitialized_String_Var;
像往常一样,必须小心未初始化的标量对象。