Ada语言宝书 #2: Ada 2005 受限类型  — 集合中的 默认值 标记

宝书 #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;

像往常一样,必须小心未初始化的标量对象。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值