1. 程式人生 > >Ada語言寶書 #2: Ada 2005 受限型別 — 集合中的 預設值 標記

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;

像往常一樣,必須小心未初始化的標量物件。